Make

如果命令失敗,不要停止製作,但檢查退出狀態

  • May 24, 2021

我試圖指示 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; }

引用自:https://unix.stackexchange.com/questions/153763