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

nuypyhwy  于 2023-10-23  发布在  Shell
关注(0)|答案(1)|浏览(126)

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

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

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

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

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

  1. bash
  2. \_ bash
  3. | \_bash
  4. | \_ sleep 10
  5. \_ps T --forest
0lvr5msh

0lvr5msh1#

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

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

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

相关问题