INT と ERR の両方がキャプチャされますが、コールバックは複数回実行されます。

INT と ERR の両方がキャプチャされますが、コールバックは複数回実行されます。

次のコードを使用してINTとERRをキャプチャします。

set -ex -o pipefail

dest=$(mktemp -d)
cd "$dest"

trap "echo; echo Clean up; rm -rf $dest" INT ERR
sleep 9999

クリーンコールバックを押すと^C複数回実行されます。

++ echo Clean up
Clean up
++ rm -rf /tmp/tmp.KYXL110516
++ echo

++ echo Clean up
Clean up
++ rm -rf /tmp/tmp.KYXL110516

これが予想される動作ですか?一度だけできますか?

ベストアンサー1

INT信号とERR信号の両方を受信します。 SIGINT はsleepゼロ以外の戻りコードで終了します。ゼロ以外の戻りコードは、SIGERR トラップをトリガーします。

sigspecがERRの場合、パイプライン(単一の単純なコマンドで構成できます)、リスト、または複合コマンドがゼロ以外の終了状態を返すたびに、arg ...コマンドが実行されます。

個々のトラップを調べる例:

set -ex -o pipefail
trap "echo Clean up for INT" INT
trap "echo Clean up for ERR" ERR
sleep 9999

実行してCtrl-Cを押します。

+ trap 'echo Clean up for INT' INT
+ trap 'echo Clean up for ERR' ERR
+ sleep 9999
^C++ echo Clean up for INT
Clean up for INT
++ echo Clean up for ERR
Clean up for ERR

トラップを一度だけ呼び出す場合、1つのオプションはトラップERR内でトラップをリセットすることです。INT

...
trap "echo Clean up for INT; trap ERR" INT ERR
...

...結果は次のとおりです。

+ trap 'echo Clean up for INT; trap ERR' INT ERR
+ sleep 9999
^C++ echo Clean up for INT
Clean up for INT
++ trap ERR

おすすめ記事