コマンドが失敗しても停止しないように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!"
.ONESHELLは、1つのシェルですべての受信ブロックを実行します。これにより、最初のコマンドが失敗した場合、次のコマンドが問題なく実行されます。これを防ぐため
—
Paul-AG
.SHELLFLAGS = -ec
に使用する必要があります。しかし、この場合-
、makeはエラーを無視するが、すべてのブロックで失敗するため、プレフィックスをこれ以上使用することはできません(レシートの個人コマンド用)。だから、|| :
コマンドを無視する解決策の1つです。しかし、それはクロスプラットフォームではありません(Windowsにはありません|| :
または|| true
)
.ONESHELL:
ディレクティブを調査することをお勧めします。