6

EXIT トラップを使用して Bash スクリプトで構文エラーが発生した場合、呼び出し元に終了コードを伝達することは可能ですか? たとえば、私が持っている場合:

#! /bin/bash

set -eu

trap "echo dying!!" EXIT

echo yeah
echo $UNBOUND_VARIABLE
echo boo

次に、実行すると、スクリプトが実際に正常に終了しなかった場合でも、終了コード 0 が返されます。

$ bash test.sh
yeah
test.sh: line 8: UNBOUND_VARIABLE: unbound variable
dying!!

$ echo $?
0

しかし、終了トラップをコメント アウトすると、スクリプトは 1 を返します。または、バインドされていない変数を含む行をゼロ以外を返すコマンド (たとえば/bin/false) に置き換えると、その終了値が希望どおりに伝達されます。

4

2 に答える 2

3

この動作は、異なる Bash バージョンに関連しています。元のスクリプトは、Bash 4.2 では期待どおりに機能しますが、3.2 では機能しません。エラーが発生しやすいコードを別のスクリプト ファイルに格納し、それをサブシェルで実行すると、以前の Bash バージョンの問題を回避できます。

#!/bin/bash

$BASH sub.sh
RETVAL=$?

if [[ "$RETVAL" != "0" ]]; then
  echo "Dying!! Exit code: $RETVAL"
fi

サブ.sh:

set -eu

echo yeah
echo $UNBOUND_VARIABLE
echo boo
于 2014-08-07T08:48:59.747 に答える