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 时,它的新环境并不知道消息已打印,因此它会打印另一个。
理论题。有人可以解释一下为什么 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 时,它的新环境并不知道消息已打印,因此它会打印另一个。