如何在执行命令之前回显命令

时间:2015-01-29 04:43:25

标签: bash

我希望在执行命令之前回显命令。此命令替换字符串' PROJECT_NAME'与'Hello world'在file.yaml。

PROJECT_NAME="Hello world"
CMD="replace.py 'PROJECT_NAME' '${PROJECT_NAME}' file.yaml"
echo "${CMD}"
${CMD}

引用此字符串的正确方法是什么,以便命令执行,echo将显示命令?

请注意,变量$ {PROJECT_NAME}的值包含空格,而replace.py只需要3个参数。

我尝试转义所有引号(\')和美元符号(\ $)。我尝试用双引号(")交换单引号(')。

通过一些引用,它会处理" Hello world"中的每个单词。作为一个单独的arg,所以replace.py会扼杀" world"不是它期望的文件名。

我已阅读http://mywiki.wooledge.org/BashFAQ/050,但仍无法弄明白。我不想复制命令或使用set -x(因为它在使用它时打印set + x将其关闭)。

2 个答案:

答案 0 :(得分:1)

一种可能性是使用数组而不是普通字符串,然后使用printf的{​​{1}}格式在需要时重新添加引号和/或转义符:

%q

请注意,这可能不会使用您在创建数组时使用的相同引用/转义方法;例如,我尝试了以上内容并打印出来:

PROJECT_NAME="Hello world"
CMD=(replace.py 'PROJECT_NAME' "${PROJECT_NAME}" file.yaml)
printf "%q " "${CMD[@]}"; printf "\n"
"${CMD[@]}"

相当于:

replace.py PROJECT_NAME Hello\ world file.yaml

......只是编写相同命令的另一种方式。

答案 1 :(得分:1)

存储命令行并稍后执行它的正确方法可以通过两种方式完成:

  1. 使用BASH数组
  2. 使用BASH功能
  3. <强> 1。使用BASH数组:

    PROJECT_NAME="Hello world"
    cmd=("replace.py" "PROJECT_NAME" "$PROJECT_NAME" "file.yaml")
    printf "%q " "${cmd[@]}"; echo
    "${cmd[@]}"
    

    现在将其运行为:

    bash ./script.sh
    replace.py PROJECT_NAME Hello\ world file.yaml
    

    请注意%q printf的{​​{1}}空格。您也可以直接从shell运行此命令行以再次验证它,即

    replace.py PROJECT_NAME Hello\ world file.yaml
    

    <强> 2。使用功能:

    #!/bin/bash
    
    PROJECT_NAME="Hello world"
    cmd() {
       set -x
       replace.py "PROJECT_NAME" "$PROJECT_NAME" "file.yaml"
       set +x
    }
    
    cmd
    

    现在将其运行为:

    ./script.sh
    

    你会得到类似的输出:

    + replace.py PROJECT_NAME 'Hello world' file.yaml
    ...
    ...
    set +x
    

    您也可以运行此命令行:

    replace.py PROJECT_NAME 'Hello world' file.yaml