2017-09-06 13 views
4

私が何かを構築するために、次のシェルスクリプトを持っている:今なぜこのシェルスクリプトは一重引用符をコマンドに挿入しますか?

#!/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の-DCGAL_DIR =/SRC /パス '-DCMAKE_CXX_FLAGS = -frounding-数学 -std = C++ 11' -DTBB_INSTALL_DIR =/TBB/DIR -DTBB_ARCH_PLATFORM = tbb_arch:次のようにcmakeへの呼び出しが見えます。

呼び出しがエラーメッセージ、なく処理されているが、は、単一引用符に-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

これは、トレース内の引用符で空白を含むパラメータを囲むためのバッシュの方法です。この例を考えてみましょう:

#!/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はあなたの書き方を覚えていません。内部的には、各トークンを引用符を削除した配列に格納します。それが印刷されるときには、空白があることだけがわかるので、それを引用するほうがよいでしょう。

関連する問題