在我的centos7.4服务器上,如果运行的话
bash -c "python -m SimpleHTTPServer"
pstree -sp 10784 (PID of python server)
会显示
systemd(1)───sshd(922)───sshd(11595)───sshd(11597)───bash(11598)───python(11617)
与
bash -c "python -V && python -m SimpleHTTPServer"
我得到了
systemd(1)───sshd(922)───sshd(11595)───sshd(11597)───bash(11598)───bash(11638)───python(11640)
那么为什么在第二个命令中创建子 shell?
最佳答案
第二个命令使用子 shell 来处理 &&
运算符 - 它需要等待 SIGCHLD 以等待第一个命令终止,然后决定是否需要运行第二个命令。
在第一种情况下——这似乎发生了:
Bash 启动并发现它需要运行一个简单的字符串。作为优化,它然后 exec
s 该命令而不先 fork ,子 shell 被 python 命令替换。
对于第二种情况,这种优化不起作用,bash fork 运行python -V
命令并等待结果。在收到该命令退出的 SIGCHLD 后,它运行第二个命令(并且不应用优化以防止额外的 fork
)
查看 1370 行附近的 here
关于linux - 什么时候 "bash -c"会导致创建子 shell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49630873/