Bashマニュアルから
Bashがコマンドが完了するのを待ってトラップが確立されたことを知らせると、コマンドが完了するまでトラップは実行されません。
Bashがwait組み込み関数を介して非同期コマンドを待機しているときにトラップセットを持つ信号を受信すると、wait組み込み関数は128より大きい終了状態に即座に返され、すぐにトラップが実行されます。
最初の文についていくつかの実験をしてみました。
lxterminalタブで実行されているシェルから:
$ trap "echo hello" HUP $ sleep 100
次に、SIGHUPがシェルに転送されるように「x」アイコンをクリックしてタブウィンドウを閉じます。
シェルは
sleep 100
完了を待ってからトラップを実行するのではなく、すぐに終了します。理由を知りたいです。私が逃したものは何ですか?これはうまくいきます
$ trap -p trap -- 'echo hello' SIGHUP $ echo $$ 19708 $ sleep 100
次に、lxterminalの別のタブで実行します。
$ kill -HUP 19708 $
最初のタブのsleepコマンドが完了したら:
$ sleep 100 hello
ありがとうございます。
答え1
最初の例では、「x」アイコンをクリックして端末エミュレータウィンドウを閉じると、SIGHUPが制御端末(シェルなど)に送信されます。
ターミナルエミュレータウィンドウは閉じますが、シェルは終了せずに完了するsleep 100
まで実行され続け、シェルはsleep 100
SIGHUPトラップを実行します。の出力にはこれがありますが、ps
閉じた端末エミュレータウィンドウにはありません。