2017-09-12 3 views
1

私はエラーにつながる単純な関数を持つ単純なスクリプトを持っています。のは、この関数を定義してみましょう、それが壊れますセット-eの設定を内側に保持||または&&

brokenFunction() { 
    ls "non-existing-folder" 
} 

我々はそれが壊れている場合、それはうまく動作検出ブロックでこの機能を実行すると:「それが壊れている」

brokenFunction || printf "It is broken\n" 

プリント

それでは、最後に正しいコマンドを追加することで、もう少し複雑な関数を作ってみましょう:

#!/bin/sh 

brokenFunction() { 
    ls "non-existing-folder" 
    printf "End of function\n" 
} 

brokenFunction || printf "It is broken\n" 

のこのスクリプトを印刷:

$ ./script.sh 
ls: cannot access 'non-existing-folder': No such file or directory 
End of function 

私はprintf文の前に停止する機能、および「それが壊れている」を表示するには、次のブロックを期待しながら。

そして、私はbrokenFunctionの終了ステータスコードをチェックすると確かに、それは私がスクリプトの先頭にset -eを追加しようとした0

です。動作は変わりませんが、||なしで呼び出された場合、終了コードはbrokenFunctionとなり、2になります。それと共に呼び出された場合、ステータスコードはまだ0です。

set -eの設定を||という名前の関数内に保持する方法はありますか?

EDIT:この例の機能が役に立たないことに気付きました。私は単純なブロックと条件で同じ問題に遭遇する。

#!/bin/sh 
set -e 
{ 
    ls "non-existing-dir" 
    printf "End of block\n" 
} || { 
    printf "It is broken\n" 
} 

プリント

man bashで書かれたよう
$ ./script.sh 
ls: cannot access 'non-existing-dir': No such file or directory 
End of block 
+1

私はそれが期待通りに動作しない理由を見つけます。https:/ /unix.stackexchange.com/questions/65532/why-does-set-e-not-work-inside今、私はただクリーンなソリューションを探しています。 – Dunatotatos

答えて

0

は、set -eは、いくつかの文脈では無視されます。 ||または&&より前のコマンドはそのようなコンテキストです。

trapが考えられます。 trapを使用して、最後のスクリプトの作業の代替は、次のようになります。

#!/bin/sh 
abort() { 
    printf "It is broken\n" 
} 
trap 'abort' ERR 
(
    set -e 
    false 
    printf "End of block\n" 
) 
trap - ERR 

いくつかのものは、ここで気づいたことがあります。

  • trap 'abort' ERRは、任意の発生したエラーにabort機能を結合します;
  • 壊れたブロックは、2つの理由からサブシェルで実行されます。まず、set -eの設定をブロック内に保ち、境界効果を制限します。 2番目は、エラー(set -e効果)でこのサブシェルを終了し、スクリプト全体で終了することではありません。
  • trap - ERRが最後にtrapバインディングをリセットします。これは、スクリプトの次の部分が以前と同じように実行されることを意味します。

が境界効果をテストするために、我々は以前に非稼働部分を追加することができ :

#!/bin/sh 
abort() { 
    printf "It is broken\n" 
} 

trap 'abort' ERR 
(
    set -e 
    false 
    printf "End of block\n" 
) 
trap - ERR 

{ 
    false 
    printf "End of second block\n" 
} || { 
    printf "It is broken too\n" 
} 

プリントを:

It is broken 
End of second block 
+0

'trap ERR'はPOSIXではありません。おそらく 'set -e'パラメータで' trap EXIT'に変更するべきです。 – Dunatotatos

関連する問題