![bash:陷阱反应 - 不同的时间](https://linux22.com/image/198182/bash%EF%BC%9A%E9%99%B7%E9%98%B1%E5%8F%8D%E5%BA%94%20-%20%E4%B8%8D%E5%90%8C%E7%9A%84%E6%97%B6%E9%97%B4.png)
GNU bash,版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)
[curious ~]# cat ./trap-term
#!/bin/bash
trap 'echo TRAP' TERM
sleep 30
[curious ~]# ./trap-term & sleep 3; kill -TERM %1
[1] 3141
<... pause - 3s>
[curious ~]# Terminated
TRAP
[1]+ Exit 143 ./trap-term
反应立即(3秒)?!
[curious ~]# cat ./tt
#!/bin/bash
./trap-term & sleep 3; kill -TERM %1
[curious ~]# ./tt <... pause - 3s>
[curious ~]# <... pause - 30s> TRAP
反应与 bash 文档一致:
如果 Bash 正在等待命令完成并接收到已设置陷阱的信号,则在命令完成之前不会执行陷阱。
问题是为什么第一个变体比其他变体快得多?
更新:
在另一个发行版中测试:
Ubuntu 20.04.3 LTS(GNU/Linux 4.4.0-19041-Microsoft x86_64); GNU bash,版本 5.0.17(1)-release (x86_64-pc-linux-gnu):3 秒后与“Termied”和“TRAP”相同的第一个结果
@zevzek“shell 脚本中没有作业”??!
curious ~$ cat ./ttj
#!/bin/bash
./trap-term & sleep 3; jobs; kill -TERM %1
curious ~$ ./ttj
[1]+ Running ./trap-term &
curious ~$ TRAP
答案1
好吧,我自己找到了答案。
第二种情况:非交互式 shell - 作业控制被禁用 - 需要set -m
。
[curious ~]# cat ./tta
#!/bin/bash
set -m; ./trap-term & sleep 3; kill -TERM %1
[curious ~]# ./tta
<... pause - 3s>
Terminated
TRAP
[curious ~]#