![为什么 bash 在等待命令完成并收到已设置陷阱的 SIGHUP 时立即退出?](https://linux22.com/image/134151/%E4%B8%BA%E4%BB%80%E4%B9%88%20bash%20%E5%9C%A8%E7%AD%89%E5%BE%85%E5%91%BD%E4%BB%A4%E5%AE%8C%E6%88%90%E5%B9%B6%E6%94%B6%E5%88%B0%E5%B7%B2%E8%AE%BE%E7%BD%AE%E9%99%B7%E9%98%B1%E7%9A%84%20SIGHUP%20%E6%97%B6%E7%AB%8B%E5%8D%B3%E9%80%80%E5%87%BA%EF%BC%9F.png)
来自 Bash 手册
如果 Bash 正在等待命令完成并接收到已设置陷阱的信号,则在命令完成之前不会执行陷阱。
当 Bash 通过 wait 内置函数等待异步命令时,接收到已设置陷阱的信号将导致 wait 内置函数立即返回,退出状态大于 128,然后立即执行陷阱。
我为第一句话做了一些实验。
在 lxterminal 选项卡中运行的 shell 中:
$ trap "echo hello" HUP $ sleep 100
然后,我通过单击“x”图标关闭选项卡窗口,以便将 SIGHUP 发送到 shell。
shell 立即退出,而不是等待
sleep 100
完成,然后执行陷阱。我想知道为什么?我错过了什么?这个有效
$ trap -p trap -- 'echo hello' SIGHUP $ echo $$ 19708 $ sleep 100
然后从 lxterminal 的另一个选项卡运行:
$ kill -HUP 19708 $
当第一个选项卡中的 sleep 命令完成时:
$ sleep 100 hello
谢谢。
答案1
在第一个示例中,通过单击“x”图标关闭终端仿真器窗口将导致 SIGHUP 发送到控制终端(即 shell)。
终端仿真器窗口关闭,但 shell 不会退出并且sleep 100
仍在运行直至sleep 100
完成,然后 shell 执行 SIGHUP 陷阱。我们可以从 的输出中找到这一点ps
,但不能从已经关闭的终端仿真器窗口中找到。