"bash -c"私のサブシェルの変数を解析する方法は?
以下では、2番目のサブシェル(内部に「echo」を持つサブシェル)が正しく解析されます。 「touch」を使用する最初のサブシェルはそうではありません。
/bin/bash -c "\
A=/tmp/foo; \
echo $( touch \$A; ); \
echo $( echo in subshell, \$A; ); \
"
答え1
その理由は簡単です。なぜなら、サブシェルはサブシェルではなく現在のシェルで計算されるからです。エスケープすると$()
期待どおりに動作します。
/bin/bash -c "\
A=/tmp/foo; \
echo \$( touch \$A; ); \
echo \$( echo in subshell, \$A; ); \
"
答え2
二重引用符を使用するため、Bashは最初に文字列全体を評価してから実行します。
最初の行を次のように置き換えると、実行したいコードが次のように/bin/bash -c echo “\
表示されます。bash -c
/bin/bash -c echo "\
…
touch \$A; ); echo $( echo in subshell, \$A; ); "
echo in subshell, \$A; ); "
touch \$A; ); echo $( echo in subshell, \$A; );
touch \$A;
echo in subshell, \$A; );
echo in subshell, \$A;
代わりに一重引用符を使用してください。