相关疑难解决方法(0)

什么时候命令替换会产生比单独的相同命令更多的子shell?

昨天有人向我建议在bash中使用命令替换会导致产生不必要的子shell.该建议仅针对此用例:

# Extra subshell spawned
foo=$(command; echo $?)

# No extra subshell
command
foo=$?
Run Code Online (Sandbox Code Playgroud)

我认为这对于这个用例似乎是正确的.但是,快速搜索试图验证这会导致大量令人困惑和矛盾的建议.似乎流行的智慧说所有命令替换的使用都会产生一个子shell.例如:

命令替换扩展为命令的输出.这些命令在子shell中执行,其stdout数据是替换语法扩展的内容.(来源)

这看起来很简单,除非你继续挖掘,在这种情况下你会开始找到建议的参考,但事实并非如此.

命令替换不一定会调用子shell,在大多数情况下也不会.它唯一保证的是乱序评估:它只是首先评估替换中的表达式,然后使用替换结果评估周围的语句.(来源)

这似乎是合理的,但这是真的吗?这个与子shell相关的问题的回答让我觉得有点man bash需要注意:

管道中的每个命令都作为单独的进程执行(即,在子shell中).

这让我想到了主要问题.究竟是什么导致命令替换产生一个副本,这个子shell无论如何都不会被隔离地执行相同的命令?

请考虑以下情况并解释哪些情况会产生额外子shell的开销:

# Case #1
command1
var=$(command1)

# Case #2
command1 | command2
var=$(command1 | command2)

# Case #3
command1 | command 2 ; var=$?
var=$(command1 | command2 ; echo $?)
Run Code Online (Sandbox Code Playgroud)

这些对中的每一对都会产生相同数量的子壳来执行吗?POSIX与bash实现有区别吗?是否有其他情况下使用命令替换会产生一个子shell,在这种情况下运行同一组命令不会?

bash shell optimization subshell command-substitution

24
推荐指数
2
解决办法
2596
查看次数