Bash でスクリプトの終了時に締め処理を実行させたい。キャッシュや一時ファイルの削除など。
締め処理を関数に定義して exit 直前に実行させればいいのですが、なぜか毎回入れ忘れる沼にハマったのでポカヨケが欲しかったのです。
つまり OnExit で CleanUp 的なことをさせたいのです。Go 言語でいう defer(延期・遅延) や、PHP でいう register_shutdown_function(終了時自動実行関数の登録)のようなもの。
たまにしか使わないので、すぐ忘れてしまう。
しかし「bash シェル 遅延 終了時 実行」でググっても sleep を使った記事ばかり。意外なことに、なかなかドンピシャに記事がヒットしないというトラップにかったので、自分のググラビリティとして。
TL;DR (今北産業)
-
trapを使う - 発動シグナルに
EXITを使う -
Ctrl+CやSIGKILLなどのシグナルにも発動させたい場合は以下の記事を参照。-
trapコマンドのまとめ | shellのtrapについて覚え書き @ Qiita
-
#!/bin/bash
cleanup() {
echo "cleaned up!"
}
trap cleanup EXIT
echo "forced error!"
exit 1
# Output:
# forced error!
# cleaned up!
- オンラインで動作をみる @ paiza.IO
参考文献
- How "Exit Traps" Can Make Your Bash Scripts Way More Robust And Reliable @ aaron maxwell
- shellのtrapについて覚え書き @ Qiita