Bash脚本中如何将exec命令的错误信息传递给自定义函数?
实现方案
该需求完全可以实现,核心思路是捕获目标命令的标准错误(stderr)输出,执行失败时将捕获到的错误内容传递给echo_fun函数即可。
原有脚本问题修正
你当前使用的exec -e "${usrCMD}"存在逻辑缺陷:exec的本质是用指定进程替换当前运行的shell进程,只要第一条命令执行成功,整个脚本就会直接退出,不会继续循环执行后续文件中的命令。除非你明确希望只执行第一条命令就终止脚本,否则不需要加exec,直接执行变量存储的命令即可。
具体实现代码
场景1:逐行执行文件中所有命令(绝大多数场景适用)
#!/bin/bash set -eu # 此处保留你自己的echo_fun实现即可,以下仅为示例 echo_fun() { local failedCmd="$1" local errInfo="$2" echo "命令执行失败:${failedCmd}" echo "错误详情:${errInfo}" } usrFile="${1}" while read -r usrCMD do # 仅捕获命令的stderr输出,stdout正常输出到终端 # 若不需要兼容带管道、重定向的复杂命令,可去掉eval直接写${usrCMD} errMsg=$( { eval "${usrCMD}" ; } 2>&1 1>/dev/tty ) || echo_fun "${usrCMD}" "${errMsg}" done < "${usrFile}"
如果不需要保留命令的正常输出,可将1>/dev/tty替换为1>/dev/null,正常输出就不会打印到终端。
场景2:确实需要使用exec替换当前shell进程
如果你的业务逻辑就是要执行命令替换当前shell,仅在执行失败时捕获错误,代码调整如下:
errMsg=$( { exec -e "${usrCMD}" ; } 2>&1 1>/dev/tty ) || echo_fun "${usrCMD}" "${errMsg}"
注意该场景下只要命令执行成功,脚本就会直接终止,不会处理后续行的命令。
内容的提问来源于stack exchange,提问作者JDev
相关产品推荐
相关产品推荐

