web-dev-qa-db-ja.com

終了とエラーの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
Brian

終了コードがテストされているコマンドのtrap ... ERRでエラーをキャッチすることはできません。あなたの特定のケースでは、bashのmanページから:

失敗したコマンドが&&または||で実行されたコマンドの一部である場合、ERRトラップは実行されません。最後の&& ..に続くコマンドを除くリスト.

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

1
meuh