私は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 トラップは実行されません。
一般的に言えば、一連の関数のクリーンアップを保証する最も簡単な方法は、それらをすべてサブシェルで実行することです。サブシェルがどのように終了しても、クリーンアップを実行できます。