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是否正在运行,无论哪种方式都是相同的。