如果bash命令的状态在一定范围内,则表示该命令失败



是否有一种很好的方法可以在bash中调用命令并且如果其返回代码在特定范围内/满足特定条件则失败?

我的用例:

我已经在Travis上设置了CI,并且想要添加一个yarn audit检查到我的测试脚本的高或关键漏洞。当调用yarn审计时,返回的状态码是漏洞级别的位掩码,因此,例如,如果您有中等(4)和严重(16)级别,则返回20。如果至少有任何高警报,我想让脚本失败,所以如果status>= 8.

Travis的设置使得命令列表按顺序运行,当有非零状态码时中止,所以我猜基本上是set -e设置。

我当前的尝试如下:

yarn audit || (mask=$? && [ $mask -lt 8 ])

这是可行的,但是有没有更好的&比这更整洁的方法?我的意思是,对我来说,如果状态码是>=8"例如,是否有一种方法可以避免$?语法,当所有你需要做的是条件状态码一次?我正在考虑像[ $(yarn audit) -lt 8]这样的单括号表达式,这显然不是我想要的,因为$(yarn audit)返回命令的输出,而不是状态码,但只是为了得到我的目标。

如果我理解正确,脚本有set -e设置,但如果yarn audit的状态为8或更多,则仅想退出,对吗?如果是这样,您可以通过跳过mask变量来稍微简化现有的内容:

yarn audit || [ $? -lt 8 ]

主要的缺点是您不能对yarn的状态做任何其他事情,因为它会立即被[ ]测试的状态所取代。(顺便说一句,如果你想保存它以后,你必须使用{ ;}而不是( ),以避免将该代码放在子shell中)。

现在,我倾向于不相信set -e会做正确的事情,因为它关于何时退出的想法并不总是您所期望或想要的(参见BashFAQ #105:"为什么set -e(或set -o errexit,或trap ERR)不做我所期望的?")。我更喜欢显式的exit命令,像这样:

yarn audit || [ $? -lt 8 ] || {
echo "Audit failed" >&2
exit 1
}

或者,有点笨拙,但意图更清晰:

yarn audit || if [ $? -ge 8 ]; then
echo "Audit failed" >&2
exit 1
fi

相关内容

  • 没有找到相关文章

最新更新