如果 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 用于失败的主要内容,如果未能解决你的问题,请参考以下文章

如果列值在一定范围内彼此接近,则删除 pandas 行

基本的bash shell命令

将 UITextField 限制在某个字符范围内

Excel帮助:如果在日期范围内,则汇总数字

在 Google BigQuery 中获取某个时间范围内的每周订阅明细

test命令的用法