如果命令失败,则脚本失败,但在任何情况下都运行所有命令

如果命令失败,则脚本失败,但在任何情况下都运行所有命令

我需要运行脚本中的一些命令,它是源代码的自定义 linter。每次运行都会生成一份报告,如果违反规则,则会失败并返回退出代码 1。我需要在失败之前运行所有命令来生成报告,如果任何命令因非零退出代码而失败,则失败。该脚本不起作用,因为它在第一个错误时存在:

lint ./module1/src/main/java && lint ./module2/src/main/java && lint module3/src/main/java

现在我正在使用这个脚本:

lint ./module1/src/main/java
code1="$?"
lint ./module2/src/main/java
code2="$?"
lint ./module3/src/main/java
code3="$?"

if [[ "$code1" != "0" || "$code2" != "0" || "$code3" != "0" ]]; then
  exit 1
fi

但它看起来过于复杂并且不可扩展(我需要添加额外的变量并检查下一个命令)。

是否可以使这个脚本更加优雅?

答案1

如果您希望完成所有测试,然后返回最终的总体状态代码,那么您就必须这样编码。这是一种方法

#!/bin/bash
#
ss=0

lint ./module1/src/main/java || ((ss++))
lint ./module2/src/main/java || ((ss++))
lint ./module3/src/main/java || ((ss++))

exit $ss

正如所写的,它失败并显示与失败测试数量相对应的退出代码。您仍然可以测试真/假(零/非零),但如果您需要代码1在任何一个情况下精确退出或者更多测试失败,改为((ss++))整个ss=1

答案2

这有点像黑客,但您可以用于xargs此目的。默认情况下,它运行所有命令,如果其中任何命令失败,则以状态 123 退出。

在这里,我们运行三个命令,所有命令都失败,但都执行了:

echo '
echo 1 && exit 1
echo 2 && exit 1
echo 3 && exit 1
' | xargs -d "\n" -L1 -I{} bash -c {}

该命令以退出状态 123 (GNU xargs) 退出,但输出以下内容,显示所有三个命令均已运行:

1
2
3

一组类似的命令均成功退出,状态为 0:

echo '
echo 1 && exit 0
echo 2 && exit 0
echo 3 && exit 0
' | xargs -L1 -I{} bash -c {}

正如您所期望的,这里的退出状态为 0。

相关内容