Bash:检查作业是否完成

Bash:检查作业是否完成,bash,jobs,Bash,Jobs,理论问题。有人能解释一下为什么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]+ Runn

理论问题。有人能解释一下为什么
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

gnubash,5.0.3(1)版-发行版(x86_64-pc-linux-GNU)

由于脚本中禁用了作业控制,bash忽略SIGCHLD信号,并且没有收到关于终止后台进程的通知(也不希望收到通知)


因为
作业
是在子shell中执行的,所以父shell环境不知道最后一个
作业
已经检查了子退出状态,并且子脚本已终止。因此,每次创建一个新的子shell时,它的新环境都不知道消息已打印,因此它会打印另一个消息。

因为
而true
将永远不会退出,除非您自己在作业完成时或达到某种超时限制时退出,这一切都是关于
$(作业)
始终返回
完成
谢谢。因此,如果您说子shell无法将更改传递给其“父shell”,那么子shell如何区分“运行”状态和“完成”状态?为什么
$(作业)
没有一直返回“[1]+运行睡眠5&”
子shell如何区分“运行”状态和“完成”?
?它只是检查pid是否正在运行。或者is有一个pidfd打开,因此它检查pidfd是否正在运行,无论哪种方式都是相同的。