linux - 什么时候 "bash -c"会导致创建子 shell?

标签 linux bash shell

在我的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/

相关文章:

Java 程序不接受管道输入

linux - 内核堆栈虚拟地址

linux - 如何为 linux 驱动程序和内核开发准备 QT Creator

bash - awk: next 在函数内是非法的

arrays - Bash 数组脚本排除重复项

bash - bash中的浮点除法

linux - 在 bash tee 中,函数变量是局部的,我该如何逃避呢?

c++ - 如何使用 C/C++ 获取数字锁定状态?

bash - 从安装在 Windows 10 上的 ubuntu bash 启动 jupyter notebook

shell - 如何修复 docker 文件中的 "sh: 0: Can' t open start.sh”?