![bash -c" 的引号本身仅用于包含和区分其中其他命令的引号吗?](https://linux22.com/image/194820/bash%20-c%22%20%E7%9A%84%E5%BC%95%E5%8F%B7%E6%9C%AC%E8%BA%AB%E4%BB%85%E7%94%A8%E4%BA%8E%E5%8C%85%E5%90%AB%E5%92%8C%E5%8C%BA%E5%88%86%E5%85%B6%E4%B8%AD%E5%85%B6%E4%BB%96%E5%91%BD%E4%BB%A4%E7%9A%84%E5%BC%95%E5%8F%B7%E5%90%97%EF%BC%9F.png)
更新:我刚刚意识到我错了,但我不知道如何纠正。
例如,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]