条件演算子を使用してレシピを実行するとエラーが発生する

条件演算子を使用してレシピを実行するとエラーが発生する

私の Makefile は非常にシンプルです:

all:
      [ -f MyFile ] && echo "MyFile exists"

もちろん、レシピの行はタブで始まります。MyFile ファイルが実際に存在する場合は、すべて正常です。ただし、このファイルが現在のディレクトリにない場合は、次のようになります。

Makefile:2: ターゲット 'all' のレシピが失敗しました: *** [all] エラー 1

代わりに if ステートメントを使用すると、このエラーを解消できます。

all:
      if [ -f MyFile ]; then echo "MyFile exists"; fi

どちらのステートメントも、sh および bash の make 外部では正常に動作します。条件演算子が使用されている場合の make エラーの原因が私にはわかりません。何が起こっているのか、教えてください。

答え1

[ -f MyFile ] && echo "MyFile exists"

MyFile存在しない場合は0以外のステータスコードで終了しますが、

if [ -f MyFile ]; then echo "MyFile exists"; fi

MyFile存在しない場合は成功(ゼロ)ステータスコードで終了しますそして echo書き込みエラーで失敗します。

Makeはステータスコードに基づいてコマンドが失敗したかどうかを判断します。デフォルトでは、コマンドが失敗すると実行を停止します。個々のコマンド行に をプレフィックスとして付けるか-、 を実行するmake -iか、特別な.IGNOREターゲットを指定して実行することで、これを無効にできます。つまり、

-[ -f MyFile ] && echo "MyFile exists"

MyFileどちらも Make を続行させますが、存在しない場合はメッセージを出力します。

make: [Makefile:14: test] エラー 1 (無視)

パターン|| trueもこの特定のケースでは機能しますが、 のエラーは無視されますecho。が false のif condition; then command; fi場合、 Make は停止しませんconditionが、commandのエラーが考慮されますが、 はcondition && command || trueすべてのエラーを無視します。

関連情報