bashに構文エラーのためスクリプトの実行を中止させる方法は?

bashに構文エラーのためスクリプトの実行を中止させる方法は?

安全のために構文エラーが発生した場合は、bashにスクリプトの実行を中止させたいと思います。

驚いたことに、私はこれを達成できませんでした。 (set -e不足しています。 )例:

#!/bin/bash

# Do exit on any error:
set -e

readonly a=(1 2)

# A syntax error is here:

if (( "${a[#]}" == 2 )); then
    echo ok
else
    echo not ok
fi

echo status $?

echo 'Bad: has not aborted execution on syntax error!'

結果(bash-3.2.39またはbash-3.2.51):

$ ./sh-on-syntax-err
./sh-on-syntax-err: line 10: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$ 

$?まあ、構文エラーを見つけるためにすべての文を確認することはできません。

(私は合理的なプログラミング言語でこれらの安全な動作を期待しています...おそらくこれはbash開発者にバグ/要望として報告されるべきです)

その他の実験

if他に何もない。

削除if:

#!/bin/bash

set -e # exit on any error
readonly a=(1 2)
# A syntax error is here:
(( "${a[#]}" == 2 ))
echo status $?
echo 'Bad: has not aborted execution on syntax error!'

結果:

$ ./sh-on-syntax-err 
./sh-on-syntax-err: line 6: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$ 

おそらくエクササイズ2と関係があるようです。http://mywiki.wooledge.org/BashFAQ/105と関連付けられる(( ))。しかし、構文エラーが見つかった後でも実行を続けることはまだ意味がありません。

いいえ、(( ))違いはありません!

算術テストなしでパフォーマンスが良くなかった!簡単な基本スクリプト:

#!/bin/bash

set -e # exit on any error
readonly a=(1 2)
# A syntax error is here:
echo "${a[#]}"
echo status $?
echo 'Bad: has not aborted execution on syntax error!'

結果:

$ ./sh-on-syntax-err 
./sh-on-syntax-err: line 6: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$ 

答え1

すべてを関数で包むことはトリックを実行するようです。

#!/bin/bash -e

main () {
readonly a=(1 2)
    # A syntax error is here:
    if (( "${a[#]}" == 2 )); then
        echo ok
    else
        echo not ok
    fi
    echo status $?
    echo 'Bad: has not aborted execution on syntax error!'
}

main "$@"

結果:

$ ./sh-on-syntax-err 
$ ./sh-on-syntax-err line 6: #: syntax error: operand expected (error token is "#")
$ 

理由はわかりませんが、他の人が説明できますか?

答え2

あなたはその本当の意味を誤解したかもしれませんset -ehelp set表示された出力を注意深く読んでください。

-e  Exit immediately if a command exits with a non-zero status.

-e終了状態も同様です。注文するスクリプトの構文エラーに関係なく、ゼロではありません。

set -e一般的に)を使用します

構文エラーの種類によっては、スクリプトがまったく実行されない場合があります。私はbashについて話すのに十分な知識がありません正確にどのタイプの構文エラーを分類できるかによって、スクリプトはすぐに終了することがあります。おそらく、いくつかのBash専門家が介入し、すべてを明確にすることができます。

この声明を明確にしたいと思いますset -e

あなたの希望について:

私は合理的なプログラミング言語でこれらの安全な動作を期待しています...おそらくこれはbash開発者にバグ/希望として報告されるべきです。

答えは「はい」ですいいえ!観察されたとおり(set -e予想通りに応答しない)、実際にはかなりよく文書化されています。

答え3

次のように入力してスクリプト自体を確認することができます。

bash -n "$0"

スクリプトの上部近く -set -e重要なコードの前後に。

私はこれが非常に強力であるとは感じませんが、それがあなたにうまくいけば、おそらく受け入れることができると言いたいと思います。

関連情報