web-dev-qa-db-ja.com

コマンドが失敗しても作成を停止しないで、終了ステータスを確認する

GNUコマンドを失敗させても停止しないように3.81に指示するようにしています(したがって、コマンドの前に-を付けます)が、次のコマンドの終了ステータスも確認したいさらに情報メッセージを出力しますが、以下のMakefileは失敗します。

$ cat Makefile 
all:
    -/bin/false
    ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
$
$ make
/bin/false
make: [all] Error 1 (ignored)
([ $? -eq 0 ] && echo "success!") || echo "failure!"
success!

上記のMakefileが「成功」を反映するのはなぜですか? 「失敗!」の代わりに?

更新:

受け入れられた回答に続いて拡張すると、以下のようになります。

failure:                                                                                                                                                                                                                                      
    @-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"                                                                                                                                                                 
success:                                                                                                                                                                                                                                      
    @-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"     
24

Makefileルールの各更新コマンドは、個別のシェルで実行されます。だから$?前の失敗したコマンドの終了ステータスが含まれていません。$のデフォルト値が含まれていますか?新しいシェルで。それがあなたの[$? -eq 0]テストは常に成功します。

15
Kyle Jones

$?がゼロの場合は&&が機能し、ゼロ以外の戻り値の場合は$?が続行されるため、||のテストは必要ありません。

また、makeの戻り値は行の最後の続行プログラム呼び出しから取得されるため、マイナスは必要ありません。これはうまくいきます

失敗:

      @/bin/false && echo "success!" || echo "failure!" 

成功:

      @/bin/true && echo "success!" || echo "failure!"

逆のことが起こります。独自のメッセージを作成したいが、ゼロ以外の値でmakeプロセスを中断したい場合は、次のように記述する必要があります。

失敗:

      @/bin/false && echo "success!" || { echo "failure!"; exit 1; }
11
Andreas

the GNUドキュメントを作成 から:

'-'または '-i'フラグが原因でエラーが無視される場合、makeは、エラーの戻りを、successと同様に扱いますが、シェルが終了したときのステータスコードを通知するメッセージを出力し、エラーは無視されたことを通知します。

このような場合にmakeの終了ステータスを利用するには、スクリプトからmakeを実行します。

#!/bin/bash
make
([ $? -eq 0 ] && echo "success!") || echo "failure!"

そして、Makefileに以下を含めます。

all:
    /bin/false
9
Timothy Martin