コマンドが完了してトラップされたSIGHUPを受信して​​いる間にbashがすぐに終了するのはなぜですか?

コマンドが完了してトラップされたSIGHUPを受信して​​いる間にbashがすぐに終了するのはなぜですか?

Bashマニュアルから

Bashがコマンドが完了するのを待ってトラップが確立されたことを知らせると、コマンドが完了するまでトラップは実行されません。

Bashがwait組み込み関数を介して非同期コマンドを待機しているときにトラップセットを持つ信号を受信すると、wait組み込み関数は128より大きい終了状態に即座に返され、すぐにトラップが実行されます。

最初の文についていくつかの実験をしてみました。

  1. lxterminalタブで実行されているシェルから:

    $ trap "echo hello" HUP
    $ sleep 100
    

    次に、SIGHUPがシェルに転送されるように「x」アイコンをクリックしてタブウィンドウを閉じます。

    シェルは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が制御端末(シェルなど)に送信されます。

ターミナルエミュレータウィンドウは閉じますが、シェルは終了せずに完了するsleep 100まで実行され続け、シェルはsleep 100SIGHUPトラップを実行します。の出力にはこれがありますが、ps閉じた端末エミュレータウィンドウにはありません。

関連情報