Bash中如何实现兼具信息打印与函数返回的自定义函数(避免退出当前会话)
Bash中如何实现兼具信息打印与函数返回的自定义函数(避免退出当前会话)
这个场景我太熟了!之前写脚本的时候也踩过直接用exit导致整个会话直接崩掉的坑,简直欲哭无泪😅。你的需求很明确:想有个能统一打印错误信息,同时让调用它的函数直接返回的工具函数,但又不能像exit那样把整个当前shell给退了。
我给你分享几个实用的方案,从简单到灵活,你可以按需选:
方案一:最简洁的基础版
先定义一个负责打印错误并返回非0状态的函数:
# 定义错误处理函数:打印错误信息到标准错误流,然后返回1 err_return() { echo "Error: $*" >&2 return 1 }
然后在你的业务函数里这样用:
tst() { # 一行搞定判断、报错、返回 [ -z "$1" ] && { err_return "No parameters provided!"; return; } # 下面是函数正常逻辑 echo "收到参数:$1" }
这个写法的好处是简单直观,完全符合你的需求:一个函数调用+return,就完成了打印和函数返回的动作,而且绝对不会退出当前会话。
方案二:极致一行版
如果你追求代码更紧凑,还可以把return和函数调用合并成更短的一行:
tst() { [ -z "$1" ] && { err_return "No parameters provided!"; return $?; } echo "收到参数:$1" }
这里的return $?是把err_return的返回值(1)作为tst函数的返回状态码,调用tst的地方还能通过$?判断是否执行成功,非常规范。
方案三:自适应场景的进阶版
如果想让这个错误函数更智能——在函数里调用时只让函数返回,直接在shell命令行调用时则退出当前会话,可以给函数加个小判断:
err_return() { echo "Error: $*" >&2 # FUNCNAME是Bash的内置数组,存着当前的函数调用栈 # 数组长度为1说明是在顶级shell直接调用 if [[ ${#FUNCNAME[@]} -eq 1 ]]; then exit 1 else return 1 fi }
这样一来,如果你直接在命令行敲err_return "测试报错",它会退出当前shell;但如果是在tst函数里调用,就只会让tst返回,不会影响你的当前会话,实用性拉满!
小提示
把错误信息输出到>&2(标准错误流)是个好习惯,这样可以和正常的标准输出区分开,后续如果需要重定向输出的话,不会把错误信息和正常结果混在一起。
备注:内容来源于stack exchange,提问作者Erick Calder
相关产品推荐
相关产品推荐

