如何实现zsh与bash兼容的特定退出码(如134)忽略方案
兼容bash/zsh的指定退出码忽略方案(以忽略134为例)
原有代码的问题
你原有的bash实现本身存在两个通用逻辑缺陷,也是导致zsh运行失败的核心原因:
- 当
node fail.js执行成功时,||后的STATUS=$?不会执行,后续判断时$STATUS为未定义变量,zsh默认开启NO_UNSET参数校验会直接抛出错误 - 用子shell
()包裹判断逻辑,else分支的exit只会退出子shell,不会终止当前父脚本,逻辑本身不符合预期 - 字符串比较
==是bash扩展语法,虽然zsh也支持,但不符合POSIX标准,存在兼容风险
兼容双shell的实现代码
基础写法(逻辑清晰)
node fail.js || { rc=$? if [ $rc -eq 134 ]; then # 忽略134退出码,正常继续执行 true else # 非134错误码,退出当前脚本 exit $rc fi }
精简一行写法
node fail.js || { rc=$?; [ $rc -ne 134 ] && exit $rc; }
兼容说明
上述写法同时适配bash和zsh的原因:
- 仅在命令执行失败时才会给
rc变量赋值,不会出现变量未定义的问题 - 用大括号
{}做命令组,所有逻辑在当前shell执行,exit可以正常终止父脚本 - 用整数比较符
-eq/-ne替代字符串比较,符合POSIX标准,无shell语法兼容问题 - 未使用任何bash/zsh独有扩展语法
内容的提问来源于stack exchange,提问作者Afterlame
相关产品推荐
相关产品推荐

