更新:我刚刚意识到我错了,但我不知道如何纠正。
例如,bash -c " echo "$S" "
和bash -c ' echo "$S" '
会得到完全不同的输出。但我目前的知识还不足以得出正确的结论。
标题可能听起来有点令人困惑,
我的意思是,例如,默认情况下bash -c ' echo " smth " '
如果echo
需要单引号'
供其自身使用,echo ' #!$smth '
然后bash -c
将不得不切换到双引号"
,以不同的echo
单引号
所以bash -c " echo ' #!$smth ' "
bash -c
无论单引号还是双引号,都没有区别。
我的理解是否正确,或者请随时纠正我。
谢谢。
答案1
双引号或不带引号的变量(例如 $S 或“$S”)在当前 shell 中展开。当您单引号字符串时,它会按字面意思(减去单引号)传递给子进程。在你的例子中你有
...
---> parent-shell
------> child-shell (bash -c)
------> echo command executed in child shell.
在第一个示例中, $S 在父 shell 中展开。在第二个示例中,$S 在未定义的子 shell 中扩展为 null。导出 S 变量允许将其传递给子 shell。例子:
[me] S=foo
[me] bash -c " echo "$S" "
foo
[me] bash -c ' echo "$S" '
[me] export S
[me] bash -c ' echo "$S" '
foo
[me]