Bash
如何獲取 find 啟動的命令的退出程式碼?
我在 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
提前退出。關於評論中的問題:
for n; do ... ; done
看起來很奇怪,但當您意識到沒有任何東西可以迭代時,for
循環將"$@"
隱式迭代時是有道理的。- 最後的尾隨
sh
將被放置在$0
外殼sh -c
中。將{}
被許多路徑名替換。沒有sh
那裡,第一個路徑名最終會出現在$0
並且不會被循環拾取,因為它不在$@
.$0
通常包含目前解釋器的名稱(它將在sh -c
shell 產生的錯誤消息中使用)。