加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 01:44:41 所属栏目:安全 来源:网络整理
导读:我正在制作一个 shell脚本,它运行一系列测试作为CI管道的一部分.我想运行所有测试(如果一个测试失败,我不想早点退出).然后,在脚本结束时,如果任何测试失败,我想返回负退出代码. 任何帮助,将不胜感激.我觉得这将是一个非常常见的用例,但我无法通过一些研究找
我正在制作一个 shell脚本,它运行一系列测试作为CI管道的一部分.我想运行所有测试(如果一个测试失败,我不想早点退出).然后,在脚本结束时,如果任何测试失败,我想返回负退出代码.

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

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

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

这看起来很奇怪,就像更多的工作而不是必要的,但我是bash脚本的新手.我错过了什么吗?

解决方法

一种可能的方法是通过ERR陷阱捕获非零退出代码.假设您的测试不包含管道|只需将错误代码直接返回到启动的shell,你就可以做到

#!/usr/bin/env bash

exitCodeArray=()

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

trap onFailure ERR

# Add all your tests here

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

在上面的代码段之后的任何地方添加测试.因此,每当测试返回非零返回码时,我们就会继续将退出代码添加到数组中.因此,对于最终断言,我们检查数组元素的总和是否为0,因为在理想情况下,如果成功则所有情况都应该返回.我们之前重置了陷阱集

trap '' ERR

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读