gpt4 book ai didi

Bash 命令替换 + 参数扩展

转载 作者:行者123 更新时间:2023-11-29 09:29:17 24 4
gpt4 key购买 nike

我对引号和参数以及 glob 扩展应该如何在子 shell 中工作感到困惑。子 shell 命令行的引用和扩展是否总是在子 shell 进程的上下文中发生?我的测试似乎证实了这一点。

Tuomas@DESKTOP-LI5P50P MINGW64 ~/shell/test1/test
$ ls
a b c

Tuomas@DESKTOP-LI5P50P MINGW64 ~/shell/test1/test
$ echo "$(echo *)"
a b c
# The subshell expands the * glob

Tuomas@DESKTOP-LI5P50P MINGW64 ~/shell/test1/test
$ echo $(echo '*')
a b c
# The subshell outputs literal *, parent shell expands the * glob

Tuomas@DESKTOP-LI5P50P MINGW64 ~/shell/test1/test
$ echo $(echo "*")
a b c
# The subshell outputs literal *, parent shell expands the * glob

Tuomas@DESKTOP-LI5P50P MINGW64 ~/shell/test1/test
$ echo "$(echo '*')"
*
# The subshell outputs literal *, parent shell outputs literal *

Tuomas@DESKTOP-LI5P50P MINGW64 ~/shell/test1/test
$ foo=bar

Tuomas@DESKTOP-LI5P50P MINGW64 ~/shell/test1/test
$ echo "$(echo $foo)"
bar
# The subshell expands variable foo

Tuomas@DESKTOP-LI5P50P MINGW64 ~/shell/test1/test
$ echo $(echo '$foo')
$foo
# The subshell outputs literal $foo

Tuomas@DESKTOP-LI5P50P MINGW64 ~/shell/test1/test
$ echo $(echo "$foo")
bar
# The subshell expands variable foo

Tuomas@DESKTOP-LI5P50P MINGW64 ~/shell/test1/test
$ echo "$(echo '$foo')"
$foo
# The subshell outputs literal $foo

我说的对吗?是否存在任何情况,父 shell 会在 fork 之前以某种方式处理或评估子 shell 命令行?

最佳答案

解析——因此,决定如何引用哪些内容——发生在 fork 之前。因为 shell 的分支副本具有其父进程内存的写时复制实例,所以它也具有解析树,并从其父进程继承此信息。

参数扩展(在您的示例中是 $foo 的)发生在 fork 之后。类似地,foo 的内容首先被字符串拆分和全局扩展以生成一个参数列表以传递给子 shell 内的 echo。然后该子 shell 运行 echo,写入 stdout 的输出由父进程(原始 shell)读取。

命令替换结果(由 echo 写入的内容)的字符串拆分和 glob 扩展发生在父进程中,在它读取其子进程的输出作为字符串之后。

关于Bash 命令替换 + 参数扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51846181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com