2016-12-29 15 views
1

私のBASHスクリプトがスクリプト内のエラーで終了するようにします。しかし、私はそれを働かせることはありません。BASHスクリプトの終了エラーが発生していません

トラップとセット-eを使用して、同時に両方を試しました。ここで

は、テストスクリプトです:

#!/bin/bash 

# Exit on error 
trap 'exit' ERR 
set -e 

h=1 
b=$((h+)) # this produces an error 
echo $? 
echo $b 
echo "end" 

そして、私は、スクリプトを実行する場合のように出力が見えます:

test.sh: line 8: h+: syntax error: operand expected (error token is "+") 
1 

end 

は、なぜそれが動作していない、そしてどのように私は2つのそれぞれを得るのですか働く方法は?

+0

この点はどうですか? 'ERR'トラップと' set -e'は_syntaxエラーのためにここにはありません。_ –

+0

@gniourf_gniourf:自分の知りたいことがある場合は、私の解決策が適切な参照を見つけることができないので、私に教えてください。適切な 'EXIT'シグナル – Inian

+0

@Inian:それは意味があるのか​​どうか本当にわかりません...とにかくこの仕事のために設計されていないツールを使うのは何ですか? –

答えて

1

set -eとトラップの文脈で構文エラーが発生しました。これらについて予期しないような行動を特定します。しかし、問題はトラップかシェルオプションのどちらかとは関係ありません。

は(ちょうどインタラクティブシェルではなく、あなたのスクリプトで)これを試してみてください:

echo $((H+)) && echo OK || echo NOT_OK 

これは失敗します、もちろん(右後のエコー$?を試してみてください)。しかし、それは "NOT_OK"をエコーし​​ません。何もエコーしません。全く自然に見えません。

したがって、構文エラーが存在する場合、通常のシェルセマンティクスは分解されます。シンタックスエラーによる失敗は、コマンドがゼロ以外のステータスを返すように振る舞うとは想定できません。これは、以前使用していたシェルエラー処理の一部をはっきりとバイパスします。

もう1つ...これは算術式の構文エラーですが、スクリプトの解析時には検出されません。スクリプトが実行されるのを防ぐことはできません(引用符がない、かっこなど...)。

これは同じことを行います

[[ A = ]] && echo OK || echo NOT_OK 

をしかし、これは(NOT_OKが表示されます)されていません。

[ A = ] && echo OK || echo NOT_OK 

ダブル括弧条件文は、予約語である、単一の括弧条件文はシェルの組み込みコマンドがありながら、 、それは行動の違いと関係しているかもしれません。

+0

あなたの答えはありがとうございます、それはかなり明確です!私は構文エラーであなたの議論を理解すると思う。そのため、bashスクリプトは主に構文エラーを起こすことはありませんが、たとえば、あるべき外部入力が使用されている場合は、その形式になっていないため、構文エラーが発生する可能性があります。それは私のアプリケーションで起こったことです。 – Jadzia

+0

実際のシェルソースコードが、一致しない括弧と同じ意味で「構文エラー」とみなされるかどうかはわかりませんが、明らかにゼロ以外のコードを返すコマンドとは異なる方法で失敗します。直感的に言えば、エラーコードを返すコマンドの代わりに、構文エラーがあると判断したシェルが、ステートメントの実行を停止します(すべてが||または&&の後に続くものをバイパスします)。戻りコード自体は、$(())構造のものを使用しません。しかしそれはただの理論に過ぎません。 – Fred

+0

私はあなたの意見を持っていると思う、それについてコメントしてくれてありがとう! – Jadzia

1

スクリプトの最初の行に#!/bin/bashの代わりに#!/bin/shを使用するようにしてください。 これ以外の場合、bash set -o errtraceでエラートレースを有効にすることができます。 bashのmanページから

:-o errtraceシェルオプションが が有効になっていない限り

ERRトラップは継承されません。

+0

ありがとうございます。第二の方法はとても良いようです。しかし、/ bin/shがbash以外のシェルにリンクされている可能性があるため、 "#!/ bin/sh"の最初の方法は問題になるかもしれません。 – Jadzia

+0

はい、あなたは正しいです。私の "sh"は "ダッシュ"を指しています –

+0

@Jadzia:元のコードでは、どのような変更があなたの問題を解決しましたか、それを示すために答えを編集できますか? – Inian

0

hを増やしたいと思いますか? do b = $((h ++))

+0

あなたの答えをありがとう。しかし、いいえ、私は増加hをしたくありません。これはエラーを作成するための例として使用されたばかりです。ここでの全体的なポイントは、エラー処理です。 – Jadzia

関連する問題