Bash

如何獲取 find 啟動的命令的退出程式碼?

  • May 30, 2019

我在 Travis-CI 中使用“查找”來使用程序檢查特定文件類型。(確切地說,這是一個 shellcheck 檢查。)

但是,當使用find它執行的命令/子shell的退出程式碼時,自然會被丟棄,因為它們不會傳遞給“主腳本”。

例如,這是一個查找命令:

find . -type f -iname "*.sh" -exec sh ./testScripts.sh "{}" \;

./testScripts.sh根據測試結果,可能會以 0 或 >= 1 退出。

使用正確的testScripts.sh退出程式碼正確退出,但由於find命令的退出程式碼始終為“0”。我想要的是,如果一個文件/執行錯誤,這個錯誤會“傳播”到 Travis-CI。

我怎樣才能做到這一點?

在評論中使用斯蒂芬基特的建議:

find . -type f -iname "*.sh" -exec sh -c 'for n; do ./testScripts.sh "$n" || exit 1; done' sh {} +

這將導致sh -c腳本以非零退出狀態盡快退出testScript.sh。這意味著它find也將以非零退出狀態退出:

如果以加號終止,則評估主路徑名的路徑名將聚合到集合中,並且每個集合都會呼叫一次實用程序,類似於xargs(1). 如果任何呼叫以非零退出狀態退出,那麼find最終也會這樣做,但這不會導致find提前退出。


關於評論中的問題:

  1. for n; do ... ; done看起來很奇怪,但當您意識到沒有任何東西可以迭代時,for循環將"$@"隱式迭代時是有道理的。
  2. 最後的尾隨sh將被放置在$0外殼sh -c中。將{}被許多路徑名替換。沒有sh那裡,第一個路徑名最終會出現在$0並且不會被循環拾取,因為它不在$@. $0通常包含目前解釋器的名稱(它將在sh -cshell 產生的錯誤消息中使用)。

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