如何让Bash函数遇非零退出码终止且不退出整个Shell
Bash 函数内实现命令失败即终止且不退出整个Shell的方案
完全可以实现,有3种常用的落地方式,根据你的使用场景选择即可:
方案1:子shell包裹函数(优先推荐)
把函数的大括号{}换成小括号(),整个函数会在独立子shell中运行,子shell内的set -e配置不会影响父Shell,执行失败只会终止子shell(也就是终止函数运行),不会带崩整个当前Shell。
示例代码:
my_func() ( set -e echo "第一步执行正常" ls 不存在的文件 # 该命令执行失败,直接终止函数 echo "该行不会被打印" )
优势:写法最简单,几乎没有边界问题。
限制:子shell内修改的变量、环境配置无法同步到外层Shell,如果你需要在函数里修改外层变量不要用这个方案。
方案2:当前Shell运行+ERR陷阱
如果需要在函数里修改外层变量,就用这个方案:先保存Shell原有配置,开启set -e和ERR陷阱,命令出错时自动return,函数执行结束后恢复原有Shell配置即可。
示例代码:
my_func() { # 保存原有配置 local old_errexit=$(shopt -po errexit) local old_err_trap=$(trap -p ERR) # 开启失败即返回逻辑 set -e trap 'return $?' ERR # 业务逻辑 outer_var=修改成功 # 可以正常修改外层变量 echo "第一步执行正常" ls 不存在的文件 # 执行失败直接return,不会往下走 echo "该行不会被打印" # 恢复原有配置 eval "$old_errexit" eval "$old_err_trap" }
方案3:手动追加返回判断(适合短逻辑函数)
如果函数逻辑很短,可以给每个需要判断执行结果的命令后面追加|| return $?,也能实现失败就终止函数的效果,不需要修改Shell配置。
示例代码:
my_func() { echo "第一步执行正常" || return $? ls 不存在的文件 || return $? # 执行失败直接返回 echo "该行不会被打印" || return $? }
内容的提问来源于stack exchange,提问作者Philippe
相关产品推荐
相关产品推荐

