如何解析“bash -c”内子 shell 中的变量?
下面,第二个子 shell(内部带有“echo”的子 shell)正确解析。第一个子 shell——带有“touch”——没有。
/bin/bash -c "\
A=/tmp/foo; \
echo $( touch \$A; ); \
echo $( echo in subshell, \$A; ); \
"
答案1
原因很简单,因为子 shell 是从当前 shell 计算的,而不是从子 shell 计算的。转义$()
将使其按您的预期工作:
/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;
请改用单引号。