2016-04-05 2 views
0

Linuxでエラーレベルを確認するには、$?を使用することができます。以前のコマンドが失敗した場合でも、いずれかのコマンドが正常に実行された場合は、$?の値がリセットされます。私は以下のように試験のために使用コード:

cd /vobs/test2/test3 
if [ $2 = "R" ]; then 
    mv missing ~/missing2 
echo "Created" 

mv missing ~/missing2$?1に等しくなければならない障害が発生したが、最後のコマンドによるecho "Created"$?0に等しくなる行われると仮定します。上記のコードのスキャンを実行して、$?=1の瞬間にexit 1コマンドを実行する方法。私は他のすべてのコマンドを実行するために実行することができますが、それは実行する最善の方法ではありませんか?これについていくつかアドバイスが必要です。

+1

シェルスクリプトの作業断片を示した場合に役立つことに注意してください。あなたが本当に思いついたことを推測するのを困難にする 'fi'を見逃してしまったのです - ' if'の本体の内側の 'echo'か、それの外側ですか?押し込みも私たちを助けません。一般に、 '' $ 2 ''を引用符で囲むべきです(ただし、' "R" 'の前後に引用符を省略しても問題ありません。コマンドが失敗することを心配しているなら、あなたはそれをテストすることができます: 'もしmv missing〜/ missing;次に "Created"をエコーし​​ます。 else echo "作成に失敗しました";あなたは 'set -e'を使うことができます。 –

+2

ベストプラクティスは、一般に、手元の即時スクリプトに適した方法でエラー処理を構築することです。 'die(){(($#))&& echo" $ * ">&2;出口1。 } 'は、この目的のための便利なユーティリティ関数であり、' cd/vobs/test2/test3 ||死ぬ。 –

+0

... 'set -e'を使うことができますが、注意と注意がかなり必要です。既存の回答へのコメントで私のリンクを見てください。 –

答えて

2

最初に失敗したコマンドをset -eで終了することができます。これは非公式 "strict bash mode" の一部です:

  • set -e

    すべてのエラーで終了します。

  • set -o pipefail

    パイプラインの最初の問題ではなく、最後のものだけで失敗します。

  • set -u

    未定義の変数へのアクセスに失敗します。

+0

脇: 'pipefail'は普遍的な考え方です。他のものはもっと議論の余地がありますが、perlの "strict mode"はより一様にベストプラクティスとみなされます。その論争の根底にある技術的な問題については、BashFAQ#105:http://mywiki.wooledge.org/BashFAQ/105 –

+0

を参照してください。そうでないと、 'pipefail'は時々邪魔になることはありません。 'grep -q'への配管を考慮して、' SIGPIPE'を得て、その最初の試合の後に0以外の値を出すパイプラインの中の項目が見つかるようにしてください。 –

+0

こんにちは、私はset -eをテストしました。それはうまく動作します。-eについていくつか心配していますか?[$?== 1] exit 1と同じ機能を持っていますか?パイプについては、あなたが投稿したリンクを読んでいます。値が1で、エコー ""のように実行されたコマンドが渡されました。しかし、私は3つ以上のコマンドを持っている私のコードでそれをテストすると、2番目のコマンドが失敗した場合に最後のエコーで0を返します。代わりにコード全体? – RandyWong

関連する問題