
私はコマンドが失敗してもGNU Make 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!"
答え1
ルールの各更新コマンドは、Makefile
別々のシェルで実行されます。したがって、以前に失敗したコマンドの終了ステータスは含まれず、$?
新しいシェルのデフォルト値です。$?
これが[ $? -eq 0 ]
テストが常に成功する理由です。
答え2
0の場合は動作し、戻り値が0以外の場合は続行するため、$?
テストする必要はありません。&&
$?
||
そして、makeの戻り値はその行の最後の進行呼び出しから取得されるため、マイナス記号は必要ありません。だからこれは素晴らしい作品です
失敗する:
@/bin/false && echo "success!" || echo "failure!"
成功:
@/bin/true && echo "success!" || echo "failure!"
逆の場合が発生します。独自のメッセージを実行し、ゼロ以外の値で make プロセスを中断するには、次のように書く必要があります。
失敗する:
@/bin/false && echo "success!" || { echo "failure!"; exit 1; }
答え3
~からGNU make ドキュメント:
「-」または「-i」フラグが原因でエラーを無視する必要がある場合は、make はエラーの返却を成功として扱います。ただし、シェルが終了したときにステータスコードを知らせ、エラーが無視されたことを示すメッセージを印刷するだけです。
make
この場合、終了状態を利用するにはmake
スクリプトで実行してください。
#!/bin/bash
make
([ $? -eq 0 ] && echo "success!") || echo "failure!"
そしてMakefileに以下を含めなさい:
all:
/bin/false
答え4
これが私がしたことです。
.PHONY: test-cleanup
test-cleanup:
$(eval CLEANUP = echo "Some cleanup procedure")
@/bin/true && touch _testok || $(CLEANUP) ;\
if [ -f "_testok" ]; then \
rm -f _testok ;\
echo "What a success!" ;\
else \
echo "Failure :-(" ;\
exit 1 ;\
fi
以下を印刷します。
What a success!
/bin/true
に変更すると、/bin/false
次のような結果が出力されます。
Some cleanup procedure
Failure :-(
make: *** [Makefile:4: test-cleanup] Error 1