来自 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
,但不能从已经关闭的终端仿真器窗口中找到。