次のコードを使用して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