Bash中忽略特定退出码的最优方法及多码场景处理
Bash中处理timeout退出码的标准实现方法
处理单个忽略退出码(仅忽略超时124)
不用单独获取$?再判断,直接通过命令后接||捕获非零退出状态,在后续块中处理逻辑:
timeout my_cmd || { local exit_code=$? if [ "$exit_code" -ne 124 ]; then exit "$exit_code" fi } other_cmds
逻辑说明:
timeout my_cmd执行后,若返回非零退出码,进入||后的代码块- 捕获退出码到局部变量
exit_code,避免被后续命令覆盖 - 若退出码不是124(即非超时失败),直接以该码退出脚本;若是124,则跳过退出,继续执行
other_cmds
处理多个忽略退出码
如果需要忽略多个退出码(比如同时忽略超时124和用户中断130),用case语句更清晰:
timeout my_cmd || { local exit_code=$? case "$exit_code" in 124|130) : ;; # 空命令,什么都不做,直接继续 *) exit "$exit_code" ;; # 其他错误码直接退出脚本 esac } other_cmds
逻辑说明:
case匹配退出码,指定需要忽略的码用|分隔:是bash的空命令,用于占位表示“忽略该情况,继续执行”- 未匹配到的退出码,直接以原码退出脚本,终止后续执行
补充说明
- 这种写法比单独用
$?判断更可靠,避免了$?被中间命令意外覆盖的问题 - 如果脚本开启了
set -e(errexit模式,命令失败即退出),该写法依然有效,因为||会让set -e忽略当前命令的错误,转而执行我们自定义的退出逻辑
内容的提问来源于stack exchange,提问作者link89
相关产品推荐
相关产品推荐

