あなたの(おそらく単純化された)例は、あなたが言及した問題を示していません:
+ 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リストで実行されたコマンドの一部である場合、またはコマンドの戻りステータスが反転している場合、トラップは実行されません。を使用して。これらは、
オプションが従う条件と同じです。until
while
if
elif
&&
||
!
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