首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果命令失败,则失败脚本,但无论如何运行所有命令

如果命令失败,则失败脚本,但无论如何运行所有命令
EN

Unix & Linux用户
提问于 2020-07-06 07:45:13
回答 2查看 2.5K关注 0票数 5

在我需要运行的脚本中有一些命令,它是源代码的自定义链接。每次运行都会生成一个报告,如果违反规则,退出代码1就会失败。我需要在失败之前运行所有命令来生成报告,如果任何命令在非零退出代码中失败,则失败。此脚本无法工作,因为它存在于第一个错误上:

代码语言:javascript
复制
lint ./module1/src/main/java && lint ./module2/src/main/java && lint module3/src/main/java

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

代码语言:javascript
复制
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

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

有可能让这个脚本更优雅吗?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2020-07-06 08:50:57

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

代码语言:javascript
复制
#!/bin/bash
#
ss=0

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

exit $ss

正如所写的那样,它失败了,退出代码对应于失败测试的数量。您仍然可以测试true/false (零/非零),但是如果您要求在任何一个或多个测试失败时使用精确的1退出代码,则始终将((ss++))更改为ss=1

票数 13
EN

Unix & Linux用户

发布于 2021-09-18 01:08:19

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

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

代码语言:javascript
复制
echo '
echo 1 && exit 1
echo 2 && exit 1
echo 3 && exit 1
' | xargs -d "\n" -L1 -I{} bash -c {}

退出状态为123 (GNU xargs),但输出如下,显示所有三个命令都已运行:

代码语言:javascript
复制
1
2
3

一组类似的命令,它们都在状态0的情况下成功退出:

代码语言:javascript
复制
echo '
echo 1 && exit 0
echo 2 && exit 0
echo 3 && exit 0
' | xargs -L1 -I{} bash -c {}

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

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/596959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档