私はコマンドが失敗しても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 ]
テストが常に成功する理由です。