2017-02-24 11 views
0

はここmyscript.shの内容です空のtestファイルが作成されます:バッシュ "厳格" モードと矢印(>)演算子

-rw-r--r-- 1 spg staff  0B 23 Feb 16:32 test 

私は、 (set -euo pipefailの組み合わせを使用して)barコマンドを見つけられなかった場合、この時点でスクリプトの実行が停止し、空のtestファイルが作成されません。

>オペレータ(この場合はbar)の左側の式が失敗した場合、どのようにしてtestファイルを作成できないかを知りたいと思います。

+2

ところで、たとえば、実行してbarが最初に成功するかどうかをテストしようとすることができます。 'set -e'の意図しない結果のいくつかを記述する[BashFAQ#105](http://mywiki.wooledge.org/BashFAQ/105)と[BashFAQ#112](http://mywiki.wooledge .org/BashFAQ/112)( 'set -u'の意図しない結果のいくつかを記述しています)。 –

+0

@CharlesDuffyこれは非常に興味深い記事です。共有のおかげです。 – spg

+0

Bashの重大なエラー処理では、 'set -e'を使う代わりに(1)トラップエラーが発生し、(2)各レベルで"例外 "コール階層内にあります。そうすることで、明示的に処理された障害シナリオとバグの違いをスクリプトに伝えることができます。それはtry/catchメカニズムのように見えます。ほとんどの人が投資したいよりも多くのシェルコードを必要としますが、それは実行可能で再利用可能であり、一度達成されると、関数内のバグに起因する戻りコードを受け取る論理演算子の専制主義から解放されます。 – Fred

答えて

2

リダイレクトは、プロセスが呼び出される前に実行され、stdout(この場合))をファイルに接続できるようにします。そのため、barが存在しなくてもtestが作成されます。リダイレクションを設定するときに、コマンドの呼び出しが失敗することはわかりません。

リダイレクトを使用している間にファイルを作成することを避ける簡単な方法はないと思います。あなたは-eu`設定良いアイデアは...非常に論争と継続的な議論で実際にある `かどうか、Perlのstrictモードとは異なり、

if command -v bar; then 
    bar > test 
else 
    exit 1 # or whatever you want since the command would have failed 
fi 
+1

私は実際にこれを逆転させるでしょう: 'もし!コマンド-v bar;次に出口1。それをスクリプトの冒頭に置きます。重要なコマンドが存在することを確認したら、コマンドの欠落によるエラーではないことを知ってスクリプトの残りの部分を書き込むことができます。 – chepner