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!"
Makefileルールの各更新コマンドは、個別のシェルで実行されます。だから$?前の失敗したコマンドの終了ステータスが含まれていません。$のデフォルト値が含まれていますか?新しいシェルで。それがあなたの[$? -eq 0]テストは常に成功します。
$?
がゼロの場合は&&
が機能し、ゼロ以外の戻り値の場合は$?
が続行されるため、||
のテストは必要ありません。
また、makeの戻り値は行の最後の続行プログラム呼び出しから取得されるため、マイナスは必要ありません。これはうまくいきます
失敗:
@/bin/false && echo "success!" || echo "failure!"
成功:
@/bin/true && echo "success!" || echo "failure!"
逆のことが起こります。独自のメッセージを作成したいが、ゼロ以外の値でmakeプロセスを中断したい場合は、次のように記述する必要があります。
失敗:
@/bin/false && echo "success!" || { echo "failure!"; exit 1; }
the GNUドキュメントを作成 から:
'-'または '-i'フラグが原因でエラーが無視される場合、makeは、エラーの戻りを、successと同様に扱いますが、シェルが終了したときのステータスコードを通知するメッセージを出力し、エラーは無視されたことを通知します。
このような場合にmake
の終了ステータスを利用するには、スクリプトからmake
を実行します。
#!/bin/bash
make
([ $? -eq 0 ] && echo "success!") || echo "failure!"
そして、Makefileに以下を含めます。
all:
/bin/false