使用條件運算子執行配方時出錯

使用條件運算子執行配方時出錯

我的 Makefile 非常簡單:

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

當然,配方行以製表符開頭。如果檔案 MyFile 確實存在,則一切正常。但如果該文件不在當前目錄中,我會得到:

Makefile:2: 目標「全部」的配方失敗 make: *** [全部] 錯誤 1

我可以使用 if 語句來消除此錯誤:

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

這兩個語句在 make 之外的 sh 和 bash 中都可以正常運作。我不清楚使用條件運算子時出現 make 錯誤的原因是什麼。一個想法發生了什麼事?

答案1

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

MyFile如果不存在則以非零狀態代碼退出,而

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

退出並顯示成功(零)狀態代碼,除非MyFile存在 echo因寫入錯誤而失敗。

Make 依靠狀態碼來確定命令是否失敗,並且當任何命令失敗時它預設停止執行。您可以透過在單一命令列中新增前綴來停用此功能-,或透過執行make -i或指定特殊.IGNORE目標來整體停用此功能。因此

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

都會允許 Make 繼續,但如果MyFile不存在,仍然會導致它列印一條訊息:

make: [Makefile:14: test] 錯誤 1(忽略)

|| true圖案在這種特定情況下也適用,但它會忽略echo.如果為 false,if condition; then command; fi不會導致 Make 停止,但會考慮 的錯誤,而會忽略所有錯誤。conditioncommandcondition && command || true

相關內容