rug*_*ugk 7 command-line shell bash find exit-status
我在 Travis-CI 中使用“查找”来检查程序的特定文件类型。(准确地说,它是一个 shellcheck 检查。)
但是,当使用find由它执行的命令/子shell 的退出代码时,它们自然会被丢弃,因为它们不会传递给“主脚本”。
例如,这是一个查找命令:
find . -type f -iname "*.sh" -exec sh ./testScripts.sh "{}" \;
Run Code Online (Sandbox Code Playgroud)
./testScripts.sh 可能会以 0 或 >= 1 退出,具体取决于测试结果。
在testScripts.sh正确使用正确的退出代码,但由于退出find命令的退出代码始终为“0”。我想要的是,如果一个文件/执行错误,这个错误会“传播”到 Travis-CI。
我怎样才能做到这一点?
在评论中使用 Stephen Kitt 的建议:
find . -type f -iname "*.sh" -exec sh -c 'for n; do ./testScripts.sh "$n" || exit 1; done' sh {} +
Run Code Online (Sandbox Code Playgroud)
这将导致sh -c脚本尽快以非零退出状态退出testScript.sh。这意味着也find将以非零退出状态退出:
如果以加号结尾,则评估主要路径名的路径名将聚合到集合中,并且每个集合将调用一次实用程序,类似于
xargs(1). 如果任何调用以非零退出状态退出,那么find最终也会这样做,但这不会导致find提前退出。
关于评论中的问题:
for n; do ... ; done看起来很奇怪,但是当您意识到没有任何要迭代的内容时,for循环将"$@"隐式迭代。
尾部sh在最后将被放置在$0所述的sh -c外壳。在{}将通过多个路径名的被取代。没有sh那里,第一个路径名最终会出现$0并且不会被循环拾取,因为它不在$@. $0通常包含当前解释器的名称(它将在sh -cshell产生的错误消息中使用)。