为什么“(睡眠 10 和睡眠 1);等待”return 在 1 秒而不是 10 秒后?

Why does "(sleep 10 & sleep 1); wait" return after 1 second instead of 10?

wait 没有参数应该等待所有子进程,但是

(sleep 10 & sleep 1); wait

returns 在 1 秒而不是 10 秒后,因此无法等待 sleep 10 完成。

为什么会这样,我该如何解决?

括号创建了一个子shell——一个全新的shell进程,仅用于这两个命令。

wait命令只等待shell自己的children(事实上,它能等的就这么多); grandchildren不算。由于 sleep 进程是子进程 shell 的 children 而不是主进程 shell,它们不能被 wait 编辑。

因此,发生的情况是:

  1. Subshell被创建到运行sleep 10 & sleep 1,mainshell等待它完成
    1. Subshell 运行s sleep 10, 因为&
    2. 立即继续处理
    3. Subshell 运行s sleep 1,并等待它完成
    4. 一秒后,sleep 1 退出。
    5. subshell 没有要处理的命令,因此退出。
      • 所有子shells children(即sleep 10)都是孤立的,re-parented到init进程(不是原来的shell).
  2. 主 shell 继续 wait 命令。
  3. 因为shell没有children,waitreturns马上
  4. 9 秒后,sleep 10 退出,init 清理它。

wait 识别命令的唯一方法是不要在子 shell 中退出它。在此示例中,您可以通过使用大括号或完全省略大括号来实现。无论哪种情况,首先 sleep 10 将是 运行,然后 sleep 1 将是 运行,当 sleep 1 结束时 wait 将 运行 直到 sleep 10 完成。