为什么 bash 在等待命令完成并收到已设置陷阱的 SIGHUP 时立即退出?

为什么 bash 在等待命令完成并收到已设置陷阱的 SIGHUP 时立即退出?

来自 Bash 手册

如果 Bash 正在等待命令完成并接收到已设置陷阱的信号,则在命令完成之前不会执行陷阱。

当 Bash 通过 wait 内置函数等待异步命令时,接收到已设置陷阱的信号将导致 wait 内置函数立即返回,退出状态大于 128,然后立即执行陷阱。

我为第一句话做了一些实验。

  1. 在 lxterminal 选项卡中运行的 shell 中:

    $ trap "echo hello" HUP
    $ sleep 100
    

    然后,我通过单击“x”图标关闭选项卡窗口,以便将 SIGHUP 发送到 shell。

    shell 立即退出,而不是等待sleep 100完成,然后执行陷阱。我想知道为什么?我错过了什么?

  2. 这个有效

    $ trap -p
    trap -- 'echo hello' SIGHUP
    $ echo $$
    19708
    $ sleep 100
    

    然后从 lxterminal 的另一个选项卡运行:

    $ kill -HUP 19708
    $
    

    当第一个选项卡中的 sleep 命令完成时:

    $ sleep 100
    hello
    

谢谢。

有关的在终端中输入 ctrl-c 时,为什么前台作业在完成之前不会终止?

答案1

在第一个示例中,通过单击“x”图标关闭终端仿真器窗口将导致 SIGHUP 发送到控制终端(即 shell)。

终端仿真器窗口关闭,但 shell 不会退出并且sleep 100仍在运行直至sleep 100完成,然后 shell 执行 SIGHUP 陷阱。我们可以从 的输出中找到这一点ps,但不能从已经关闭的终端仿真器窗口中找到。

相关内容