Bash中如何实现命令返回码处于指定范围时触发执行失败?
Bash 自定义命令返回码判定规则的优雅实现
针对你的场景,有几个更简洁、可读性更高的写法可选:
1. 最简单表达式写法(推荐)
直接利用算术表达式的返回值特性,不需要子shell,逻辑直观:
yarn audit; (( $? < 8 ))
逻辑说明:
- 先执行
yarn audit,不管返回值是什么都执行后面的算术判断 - 当返回码小于8时,
(( $? < 8 ))表达式为真,返回状态码0,不会触发set -e中断 - 当返回码大于等于8时,表达式为假,返回状态码1,直接触发CI中断
2. 位掩码精准匹配写法(更符合yarn audit的设计)
因为yarn audit的返回码是位掩码,如果你只需要拦截高危(8)、严重(16)及以上等级的漏洞,用位运算判断更严谨,避免后续新增低等级位时逻辑受影响:
yarn audit; (( ($? & 24) == 0 ))
其中24是8+16的和,也就是所有需要拦截的漏洞等级的位掩码和,只要返回码包含任意一个需要拦截的等级,表达式就会返回1触发中断。
3. 高可读性多分支写法
如果要给其他协作者看,用if结构的逻辑最清晰,没有理解门槛:
if yarn audit; then # 无任何漏洞,直接通过 exit 0 elif (( $? < 8 )); then # 仅存在低危/中危漏洞,不阻断流程 exit 0 else # 存在高危/严重漏洞,阻断CI exit 1 fi
原写法的优化提示
你之前的写法用了()子shell,会额外创建子进程产生不必要的开销,可以换成大括号组命令来优化:
yarn audit || { mask=$? && [ $mask -lt 8 ]; }
内容的提问来源于stack exchange,提问作者JHH
相关产品推荐
相关产品推荐

