gpt4 book ai didi

bash - 如果任何命令失败,最后以非零代码退出 shell 脚本

转载 作者:行者123 更新时间:2023-11-29 09:21:03 30 4
gpt4 key购买 nike

我正在制作一个 shell 脚本,它运行一系列测试作为 CI 管道的一部分。我想运行所有测试(如果一个测试失败,我不想提前退出)。然后,在脚本的末尾,如果任何测试失败,我想返回一个否定的退出代码。

如有任何帮助,我们将不胜感激。我觉得这将是一个非常常见的用例,但我无法通过一些研究找到解决方案。我很确定我不想 set -e,因为它提前退出。

我目前的想法是创建一个标志来跟踪任何失败的测试:

flag=0
pytest -s || flag=1
go test -v ./... || flag=1
exit $flag

这看起来很奇怪,并且喜欢做不必要的工作,但我是 bash 脚本的新手。我错过了什么吗?

最佳答案

一种可能的方法是通过 trapERR 捕获非零退出代码。假设您的测试不包含管道 | 并且只是将错误代码直接返回到启动的 shell,您可以这样做

#!/usr/bin/env bash

exitCodeArray=()

onFailure() {
exitCodeArray+=( "$?" )
}

trap onFailure ERR

# Add all your tests here

addNumbers () {
local IFS='+'
printf "%s" "$(( $* ))"
}

在上述代码段之后的任意位置添加您的测试。因此,每当测试返回非零返回码时,我们都会将退出码添加到数组中。因此,对于最终断言,我们检查数组元素的总和是否为 0,因为在理想情况下,如果成功,所有情况都应返回该结果。我们重置之前设置的trap

trap '' ERR

if (( $(addNumbers "${exitCodeArray[@]}") )); then
printf 'some of your tests failed\n' >&2
exit -1
fi

关于bash - 如果任何命令失败,最后以非零代码退出 shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51205224/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com