![終了とエラーの bash スクリプト トラップと差異のロジック](https://rvso.com/image/88799/%E7%B5%82%E4%BA%86%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AE%20bash%20%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%20%E3%83%88%E3%83%A9%E3%83%83%E3%83%97%E3%81%A8%E5%B7%AE%E7%95%B0%E3%81%AE%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF.png)
私はbashスクリプトを持っていて、EXITとERRの両方の条件をトラップする機能を追加したいと思っています。構造は現在
trap cleanup EXIT
function notify(reason) {}
function build {}
function dbops {}
function deploy {}
function cleanup {}
notify('start') \
&& build \
&& dbops \
&& deploy \
&& notify('finished');
エラーのトラップを追加し、(オプションで) 終了理由をキャプチャして、それを通知関数経由で送信するための推奨される方法は何ですか? 現在、クリーンアップで行われるのは、EXIT のロック ファイルを削除することだけです。
notify(reason)
スクリプトが予期せず失敗した場合に Slack にメッセージを送信できるようにしたいのですが、通常の EXIT ではメッセージを送信しません。
実行チェーンによって、エラーが適切にトラップされなくなるでしょうか?
答え1
終了コードがテストされているコマンド内ではエラーをキャッチできませんtrap ... ERR
。あなたのケースでは、bash のマニュアル ページから次のように表示されます。
失敗したコマンドが && または || リストで実行されたコマンドの一部である場合 (最後の && に続くコマンドを除く)、ERR トラップは実行されません。
一般的に言えば、一連の関数のクリーンアップを保証する最も簡単な方法は、それらをすべてサブシェルで実行することです。サブシェルがどのように終了しても、クリーンアップを実行できます。