Bash中使用coproc与进程列表无法创建嵌套子shell的问题
为什么
coproc中嵌套子shell没有生成预期的三层进程树? 现象回顾
- 执行
coproc nested { sleep 10; }时,进程树符合预期:bash(父shell)→bash(coproc创建的子shell)→sleep 10 - 执行
coproc nested { (sleep 10); }时,尽管用()显式声明了子shell,进程树却和前者完全一致,没有出现预期的四层嵌套(bash→bash→bash→sleep 10)
核心原因:Bash的子shell优化机制
Bash默认会对仅包含单个命令的子shell做优化——直接执行该命令,不额外创建子shell进程。
在coproc nested { (sleep 10); }中,(sleep 10)是一个只包含sleep单个命令的子shell块,Bash会跳过创建这层中间的bash子shell,直接让sleep运行在coproc本身创建的子shell里,所以进程树不会多出一层。
验证方法
如果给嵌套子shell里添加多个命令,破坏单命令的条件,Bash就无法进行优化,会生成预期的三层嵌套进程树:
coproc nested { (sleep 10; echo "coproc done"); }
此时用ps T --forest查看,就能看到bash→bash→bash→sleep 10的结构。
内容的提问来源于stack exchange,提问作者grassy
相关产品推荐
相关产品推荐

