【问题标题】:Why does this shell script insert single quotes into a command?为什么这个 shell 脚本在命令中插入单引号?
【发布时间】:2018-02-14 19:54:24
【问题描述】:

我有以下 shell 脚本来构建一些东西:

#!/bin/bash -x

SRC_DIR=$1

cd $SRC_DIR

rm CMakeCache.txt
cmake \
-DCGAL_DIR=/src/path \
-DCMAKE_CXX_FLAGS=" -frounding-math -std=c++11 " \
-DTBB_INSTALL_DIR=/tbb/dir \
-DTBB_ARCH_PLATFORM=tbb_arch \
.

make VERBOSE=1

现在,选项 -x 将显示脚本发出的命令。对cmake 的调用如下所示:

cmake -DCGAL_DIR=/src/path '-DCMAKE_CXX_FLAGS= -frounding-math -std=c++11 ' -DTBB_INSTALL_DIR=/tbb/dir -DTBB_ARCH_PLATFORM= tbb_arch 。

处理调用时没有错误消息,但是请注意-DCMAKE_CXX_FLAGS=... 周围的单引号'

他们来自哪里?它们的作用是什么?

【问题讨论】:

  • bash 找到包含空格的参数时,单引号会显示在跟踪输出中。

标签: bash shell sh


【解决方案1】:

当 bash 找到包含空格的参数时,单引号会显示在跟踪输出中。

例子:

bash -cx 'echo foo "xyz 123"'
+ echo foo 'xyz 123'
foo xyz 123

bash -cx "echo foo 'xyz 123'"
+ echo foo 'xyz 123'
foo xyz 123

【讨论】:

    【解决方案2】:

    这是 Bash 在跟踪中将包含空格的参数括在引号中的方法。考虑这个例子:

    #!/bin/bash -x
    
    echo Test "Test" " Test" "Test " ' Test '
    

    输出:

    + echo Test Test ' Test' 'Test ' ' Test '
    Test Test  Test Test   Test
    

    这只是提供的内容与回显的内容之间令人讨厌的不匹配。只要您的cmake 命令使用正确的参数执行,这应该不是问题。

    【讨论】:

      【解决方案3】:

      没有区别

      -DCMAKE_CXX_FLAGS=" -frounding-math -std=c++11 "
      

      '-DCMAKE_CXX_FLAGS= -frounding-math -std=c++11 '
      

      它们是写同一件事的两种方式。 Bash 不记得你是怎么写的。在内部,它将每个标记存储在一个数组中,并删除了引号。当它打印出来时,它只知道这个有空格,所以最好引用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多