Make
如果命令失敗,不要停止製作,但檢查退出狀態
我試圖指示 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!"
規則中的每個更新命令
Makefile
都在單獨的 shell 中執行。因此$?
不包含先前失敗命令的退出狀態,它包含$?
新 shell 中的預設值。這就是為什麼您的[ $? -eq 0 ]
測試總是成功的原因。
如果為零,則不需要測試
$?
since&&
有效,並且在返回值非零的情況下繼續。$?``||
而且您不需要減號,因為返回值 make 取自該行的最後一個繼續程序呼叫。所以這很好用
失敗:
@/bin/false && echo "success!" || echo "failure!"
成功:
@/bin/true && echo "success!" || echo "failure!"
相反的情況發生了:如果你想做自己的消息並且想用非零值打破 make 過程,你需要寫這樣的東西:
失敗:
@/bin/false && echo "success!" || { echo "failure!"; exit 1; }