不能使用coproc命令和进程列表在bash中创建子shell之外的嵌套shell

nuypyhwy  于 12个月前  发布在  Shell
关注(0)|答案(1)|浏览(80)

假设我运行这个命令:coproc nested { sleep 10; }它在子shell中按预期执行sleep命令。当我运行ps T --forest命令时,进程树看起来像这样。

PID TTY      STAT   TIME COMMAND
  40305 pts/0    Ss     0:00 bash
  46922 pts/0    S      0:00  \_ bash
  46923 pts/0    S      0:00  |   \_ sleep 10
  46924 pts/0    R+     0:00  \_ ps T --forest

没问题,这正是我所期待的。但是,当我像这样运行命令时:coproc nested { (sleep 10); },进程树看起来与运行ps T --forest命令时相同。

PID TTY      STAT   TIME COMMAND
  40305 pts/0    Ss     0:00 bash
  47064 pts/0    S      0:00  \_ bash
  47065 pts/0    S      0:00  |   \_ sleep 10
  47066 pts/0    R+     0:00  \_ ps T --forest

请注意,在这里,(sleep 10)是一个进程列表,它应该自动创建一个子shell来运行sleep 10命令。
所以,我期待的是这样一个过程树:

bash
 \_ bash
 |   \_bash
 |      \_ sleep 10
  \_ps T --forest
0lvr5msh

0lvr5msh1#

当一个子shell只包含一个命令时,bash会进行优化,不会派生额外的子shell。在子进程中放置多个命令。

barmar@dev:~$ coproc nested { (:; sleep 10); }
[1] 2748073
barmar@dev:~$ ps T --forest
    PID TTY      STAT   TIME COMMAND
3462478 pts/1    Ss     0:00 /bin/bash
2748073 pts/1    S      0:00  \_ /bin/bash
2748074 pts/1    S      0:00  |   \_ /bin/bash
2748075 pts/1    S      0:00  |       \_ sleep 10
2748079 pts/1    R+     0:00  \_ ps T --forest

:是一个内置的命令,什么也不做。

相关问题