如果 bash 命令的状态在某个范围内,则 Oneliner 用于失败
Posted
技术标签:
【中文标题】如果 bash 命令的状态在某个范围内,则 Oneliner 用于失败【英文标题】:Oneliner for failing a bash command if its status is within a certain range 【发布时间】:2021-12-07 02:25:37 【问题描述】:如果它的返回码在特定范围内/满足特定条件,是否有一种在 bash 中调用命令并失败的好方法?
我的用例:
我在 Travis 上设置了 CI,并希望在我的测试脚本中添加 yarn audit
检查高或严重漏洞。调用yarn audit 时,返回的状态码是漏洞级别的位掩码,例如,如果您有中等 (4) 和严重 (16) 级别,则返回 20。如果至少有任何高警报,我希望我的脚本失败,所以如果状态 >= 8。
Travis 设置为按顺序运行命令列表,当状态码非零时中止,所以我猜基本上是 set -e
设置。
我目前的尝试如下:
yarn audit || (mask=$? && [ $mask -lt 8 ])
这行得通,但还有比这更漂亮、更整洁的方法吗?我的意思是,对我来说,它并没有完全尖叫“如果状态码 >=8,则运行此命令并失败”例如,当您需要做的只是调节状态时,有没有办法避免使用 $?
语法编码一次?我正在考虑像[ $(yarn audit) -lt 8]
这样的单括号表达式,这显然不是我想要的,因为$(yarn audit)
返回命令的输出,而不是状态代码,而只是为了得到我想要的目标。
【问题讨论】:
【参考方案1】:如果我理解正确,脚本设置了set -e
,但你只想在yarn audit
的状态为8 或更多时退出,对吗?如果是这样,您可以通过跳过 mask
变量来稍微简化一下:
yarn audit || [ $? -lt 8 ]
主要缺点是您不能对yarn
的状态做任何其他事情,因为它会立即被[ ]
测试中的状态所取代。 (顺便说一句,如果您确实想将其保存以备后用,则必须使用 ;
而不是 ( )
,以避免将该代码放入子 shell 中)。
现在,我倾向于不相信set -e
会做正确的事,因为它关于何时适合退出的想法并不总是您所期望或想要的(请参阅BashFAQ #105: "Why doesn't set -e
(or set -o errexit
, or trap ERR
) do what I expected?")。我更喜欢明确的exit
命令,如下所示:
yarn audit || [ $? -lt 8 ] ||
echo "Audit failed" >&2
exit 1
或者,有点笨拙但意图更清晰:
yarn audit || if [ $? -ge 8 ]; then
echo "Audit failed" >&2
exit 1
fi
【讨论】:
谢谢。一个问题是我不确定 Travis 如何处理这样的多行命令,因为这些命令是 YAML 数组中的单个字符串,但它的代码确实更清晰。也许最好的选择是将其包装在audit.sh
脚本中,然后从 Travis 调用 - ./audit.sh
。
@JHH 我不熟悉 Travis,但听起来将它包装在脚本中可能是最干净的选择。以上是关于如果 bash 命令的状态在某个范围内,则 Oneliner 用于失败的主要内容,如果未能解决你的问题,请参考以下文章