wait
应该等待所有子进程,但是
(sleep 10 & sleep 1); wait
在1秒而不是10秒后返回,因此无法等待sleep 10
完成。
为什么会这样,我该如何解决?
答案 0 :(得分:8)
括号创建一个子shell--一个全新的shell进程,仅用于这两个命令。
wait
命令只等待一个shell自己的孩子(事实上,这就是它可以等待的全部);孙子不算数。由于sleep
进程是子shell而不是主shell的子进程,因此无法为wait
编译它们。
因此,会发生什么:
sleep 10 & sleep 1
,主shell等待它完成
sleep 10
,并由于&
sleep 1
,等待它完成sleep 1
退出。sleep 10
)都是孤儿,并重新成为init
进程的主体(不原始shell)。wait
命令。wait
会立即返回。sleep 10
退出,init
清理它。让wait
识别命令的唯一方法是不在子shell中退出它。在此示例中,您可以通过使用花括号或完全省略大括号来实现。在任何一种情况下,都会运行第一个sleep 10
,然后运行sleep 1
,sleep 1
完成后wait
将一直运行,直到sleep 10
完成。