終了とエラーの bash スクリプト トラップと差異のロジック

終了とエラーの bash スクリプト トラップと差異のロジック

私は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 トラップは実行されません。

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

関連情報