为什么这个shell脚本将单引号插入命令?

时间:2017-09-06 10:48:58

标签: bash shell sh

我有以下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=...

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

#!/bin/bash -x

echo Test "Test" " Test" "Test " ' Test '

输出:

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

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

答案 2 :(得分:1)

之间没有区别
-DCMAKE_CXX_FLAGS=" -frounding-math -std=c++11 "

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

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