我的 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 停止,但會考慮 的錯誤,而會忽略所有錯誤。condition
command
condition && command || true