20

set -e最初のエラーでスクリプトの実行を停止するために使用しています。

問題は、これでは何が悪かったのかがわからないことです。

失敗した最後のコマンドが表示されるようにbashスクリプトを更新するにはどうすればよいですか?

4

5 に答える 5

22

の代わりにset -e、ERR トラップを使用します。$BASH_LINENOエラーが発生した特定の行番号を取得するために渡すことができます。https://stackoverflow.com/a/185900/14122の回答で、これを利用したスクリプトを提供します。

要約する:

error() {
   local sourcefile=$1
   local lineno=$2
   # ...logic for reporting an error at line $lineno
   #    of file $sourcefile goes here...
}
trap 'error "${BASH_SOURCE}" "${LINENO}"' ERR
于 2012-05-24T20:04:58.960 に答える
1

で試しました--verboseか?

bash --verbose script.sh
于 2012-05-24T18:17:50.330 に答える
1

set -eエラーが発生するとすぐに処理が停止するため、単独では使用できません。デバッグに使用できる -x および -v オプションの詳細については、Bash リファレンス マニュアルのSet Builtin セクションを参照してください。

何かのようなもの:

set -e
set -v

エラーが発生すると終了し、読み取られた各入力行が表示されます。ただし、エラーのある行だけが表示されるわけではありません。そのためには、独自の明示的なエラー チェックを行う必要があります。

例えば:

set +e
if false; then
    real_exit_status=$?
    echo 'Some useful error message.' >&2
    exit $real_exit_status
fi
于 2012-05-24T19:39:43.257 に答える
0

set -ex実行時に(すべての)行が表示され、最初のコマンドで停止してゼロ以外を返します(if/while/until構成の一部としてではありません)。

于 2012-05-24T21:02:24.263 に答える