1. ホーム
  2. bash

[解決済み] 同一信号に対する複数のBashトラップ

2023-09-05 21:25:35

質問

を使用する場合 trap コマンドを Bash で実行すると、以前の trap を置き換えます。

複数の trap を発生させる方法はありますか?

どのように解決するのですか?

編集してください。

質問を読み違えたようです。答えは簡単です。

handler1 () { do_something; }
handler2 () { do_something_else; }
handler3 () { handler1; handler2; }

trap handler3 SIGNAL1 SIGNAL2 ...


オリジナルです。

コマンドの最後に複数のシグナルを列挙するだけです。

trap function-name SIGNAL1 SIGNAL2 SIGNAL3 ...

特定のシグナルに関連する関数を見つけるには、次のようにします。 trap -p :

trap -p SIGINT

同じ関数で処理される場合でも、それぞれのシグナルを別々にリストアップしていることに注意してください。

このようにすることで、既知のシグナルを指定して、追加のシグナルを追加することができます。

eval "$(trap -p SIGUSR1) SIGUSR2"

これは、同じ関数で処理されている他のシグナルがある場合でも動作します。言い換えれば、ある関数がすでに3つのシグナルを処理していたとします。既存の1つを参照し、さらに2つを追加するだけで、さらに2つを追加することができます(閉じた引用符のすぐ内側には、1つだけが上に表示されています)。

Bash >= 3.2 を使用している場合、シグナルを与えられた関数を抽出するために、このようなことを行うことができます。他の単一引用符が現れる可能性があるため、完全に堅牢ではないことに注意してください。

[[ $(trap -p SIGUSR1) =~ trap\ --\ \'([^\047]*)\'.* ]]
function_name=${BASH_REMATCH[1]}

それから、関数名などを使って、必要であればトラップコマンドを一から作り直すことができます。