BashスクリプトでExitコードをトラップする方法
質問
私のバッシュコードには多くの出口ポイントがあります。出口でクリーンアップ作業を行う必要があるので、トラップを使用して、次のような出口のコールバックを追加しました。
trap "mycleanup" EXIT
問題は、異なる出口コードがあることです。対応するクリーンアップ作業を行う必要があります。 mycleanupで終了コードを取得できますか?
解決
使えると思います $?
Exitコードを取得します。
他のヒント
受け入れられた答えは基本的に正しいです。私はただ物事を明確にしたいだけです。
次の例はうまく機能します:
#!/bin/bash
cleanup() {
rv=$?
rm -rf "$tmpdir"
exit $rv
}
tmpdir="$(mktemp)"
trap "cleanup" INT TERM EXIT
# Do things...
ただし、機能せずにクリーンアップをインラインで行う場合は、より注意する必要があります。たとえば、これは機能しません:
trap "rv=$?; rm -rf $tmpdir; exit $rv" INT TERM EXIT
代わりに、あなたは逃げなければなりません $rv
と $?
変数:
trap "rv=\$?; rm -rf $tmpdir; exit \$rv" INT TERM EXIT
あなたも逃げたいかもしれません $tmpdir
, 、トラップラインが実行されたときと tmpdir
後で価値のある変化は、予想される動作を与えません。
編集:使用します シェルチェック バッシュスクリプトを確認し、このような問題に注意してください。
他の信号のためにトラップから出口トラップを分離する方が良いことがわかりました
トラップテストスクリプトの例...
umask 77
tmpfile=`tmpfile.$$`
trap 'rm -f "$tmpfile"' EXIT
trap 'exit 2' HUP INT QUIT TERM
touch $tmpfile
read -r input
exit 10
一時ファイルがクリーンアップされます。ファイルの出口値は10です!割り込みの結果、出口値は2になります
基本的に、出口トラップで「出口」を使用しない限り、元の出口値が保存された状態で終了します。
さておき:出口トラップでの引用に注意してください。これにより、スクリプトの寿命の間にクリーンアップする必要があるファイルを変更できます。また、削除しようとする前に$ tmpfileの存在のテストも含めることが多いので、スクリプトの開始時に設定する必要さえありません。