2016-08-26 8 views
1

私はbashで何か奇妙なことに気付きました。 のは、私は、次を含むファイルトトを持っているとしましょう:サブシェルのソースが期待どおりに動作しない

#!/bin/bash 
export foo=2 

私はsource toto; echo foo=$fooを実行する場合、私はbash -c "source toto; echo foo=$foo"を実行する場合、私は、しかし= 2

期待

FOOとして取得し、私は得る

foo =

同じこと私は私が入っているファイルtest.sh作成する場合は、まだ

bash << EOF 
source toto 
echo foo=$foo 
EOF 

を実行する場合:

#!/bin/bash 
echo foo=$foo 

をそして、私はbash -c "source toto; ./test.sh"を実行し、私は最終的に

期待を取得

foo = 2

誰かがこれらの結果を理解していますか? ありがとう!

答えて

5

あなたは

bash -c "source toto; echo foo=$foo" 

を実行すると、あなたがに入力しているシェルは、文字列内のすべての変数を展開します。当時、$fooがまだ値を持っていないので、あなたの代わりに二重引用符の単一引用符を使用する場合は、

bash -c "source toto; echo foo=" 

を書いたかのように、それはだ、変数は展開されません。その後、リテラルコマンドラインはbashに送信され、$foo自体が展開されます。

bash -c 'source toto; echo foo=$foo' 

Difference between single and double quotes in Bash

+0

がそれを手に入れた参照してください!ありがとう! – user2466062

関連する問題