特定のコマンドがERRトラップをトリガーするのを防ぐ方法は?

特定のコマンドがERRトラップをトリガーするのを防ぐ方法は?

私はBashスクリプトでエラーをキャッチし、発生した内容をログに出力するためにERRトラップを使用しています。 (この質問に似ています:トラップ、ERR、エコーエラーライン)期待通りに動作します。唯一の問題は、私のスクリプトのある時点で終了コード! = 0が発生すると予想されることです。この状況でトラップが機能するのをどのように防ぐことができますか?

以下はいくつかのコードです。

err_report() {
    echo "errexit on line $(caller)" | tee -a $LOGFILE 1>&2
}

trap err_report ERR

次に、後でスクリプトで次のことを行います。

<some command which occasionally will return a non-zero exit code>

if [ $? -eq 0 ]; then
    <handle stuff>
fi

コマンドがゼロ以外の値を返すたびに、マイトラップがトリガーされます。これを防ぐために、コードのこの部分をターゲットにすることはできますか?

この質問を確認しました。"set -eu"を使用した場合のEXITおよびERRトラップの正しい動作 しかし、私はこれを私の場合にどのように適用するのかわかりません。

ベストアンサー1

エラーコードをすぐに「キャッチ」するとERR trap実行されません。できるif常にエラー追跡機能をオンまたはオフにする代わりに、ステートメントなどを使用してください。しかし、あなたはできないフロー制御チェックを使用$?すると、すでに(おそらく)キャッチされていないエラーがある可能性があります。

失敗すると予想されるコマンドがある場合 -欲しくないこれらの失敗トリガーを望むには、trap単に失敗をキャッチするだけです。これをステートメントで囲むことはif厄介で冗長ですが、次の略語はうまく機能します。

/bin/false || :  # will not trigger an ERR trap

ただし、コマンドが失敗したときに操作を実行するには、if次のようにします。

if ! /bin/false; then
    echo "this was not caught by the trap!"
fi

または、elseエラー状態もキャプチャされます。

if /bin/false; then
    : # dead code
else
    echo "this was not caught by the trap!"
fi

要約すると、即時で本質的に説明されていないエラー条件がある場合にのみset -eトリップが発生します。trap "command" ERR

おすすめ記事