7

次のように、Bash スクリプトでクリーンアップ アクションを実行したいと考えています。

#! /bin/bash
set -eu
trap 'echo "E: failed with exitcode $?" 1>&2' ERR

true
false

を使用$?するのは当然の選択として頭に浮かびましたが、そうではありません。常に含まれています0。トラップ内の終了コードを「スパイ」する方法はありますERRか?

[更新:]以前に何をテストしたかわかりません。このコードは魅力的に機能するので、小さくて良い例としてここに残します。

4

1 に答える 1

5

あなたの(おそらく単純化された)例は、あなたが言及した問題を示していません:

+ set -eu
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR
+ true
+ false
++ echo 'E: failed with exitcode 1'
E: failed with exitcode 1

返されるコマンドは、 または でERR実行される&&||、以下のスニペットに記載されている他の条件に従う可能性があります。マニュアルからの引用:

sigspecがの場合、単純なコマンドの終了ステータスがゼロ以外の場合は常に、次の条件に従ってERR、コマンドargが実行されます。失敗したコマンドがorキーワードERRの直後のコマンド リストの一部である場合、または予約語に続くテストの一部である場合、またはorリストで実行されたコマンドの一部である場合、またはコマンドの戻りステータスが反転している場合、トラップは実行されません。を使用して。これらは、 オプションが従う条件と同じです。untilwhileifelif&&||!errexit

たとえば、次のような場合:

#! /bin/bash
set -eu
trap 'echo "E: failed with exitcode $?" 1>&2' ERR

false && true

実行しても、失敗がトラップされることはありません。

+ set -eu
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR
+ false
于 2013-09-30T10:24:54.510 に答える