2017-09-06 36 views
4

我有以下的shell脚本建立的东西:这个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 /路径 '-DCMAKE_CXX_FLAGS = -frounding-数学 -std = C++ 11' -DTBB_INSTALL_DIR =/TBB/DIR -DTBB_ARCH_PLATFORM = tbb_arch 。

该呼叫被不显示错误信息进行处理,但观察单引号'周围-DCMAKE_CXX_FLAGS=...

它们来自哪里?他们的效果是什么?

+1

当'bash'发现包含空格的参数时,单引号显示在跟踪输出中。 – anubhava

回答

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

这是bash的方式发布包含在跟踪报价空白参数。考虑下面这个例子:

#!/bin/bash -x 

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

输出:

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

它只是提供对比的刺激性不匹配呼应的内容。只要你的cmake命令执行正确的参数,这应该不成问题。

1

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

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

没有什么区别他们正在写同一件事的两个方面。 Bash不记得你是怎么写的。它在内部将每个令牌存储在数组中,并且引号被删除。当它打印它们只知道这个有空格,所以最好引用它。