Bash: 检查工作完成

Bash: check job is finished

理论题。有人可以解释一下为什么 jobs 已经完成后继续返回 Done 吗?

root@test:~# cat 1.sh
#!/bin/bash

sleep 5 &
while true; do
  echo $(jobs) && sleep 1
done

root@test:~# ./1.sh
[1]+ Running sleep 5 &
[1]+ Running sleep 5 &
[1]+ Running sleep 5 &
[1]+ Running sleep 5 &
[1]+ Running sleep 5 &
[1]+ Done sleep 5
[1]+ Done sleep 5
[1]+ Done sleep 5
[1]+ Done sleep 5
^C

GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)

因为作业控制在脚本中被禁用,bash 忽略信号 SIGCHLD 并且没有收到(也不想收到)有关终止后台进程的通知。

因为 jobs 在子 shell 中执行,parent shell 环境不知道最后一个 jobs 已经检查了 child 退出状态并且 child 终止。因此,每次创建一个新的子 shell 时,它的新环境并不知道消息已打印,因此它会打印另一个。