--- #复盘/0 #临时/备忘 #状态/待处理 ## 一句话描述 [__bash 脚本规范/模板______] --- ```bash #!/bin/bash set -ueo pipefail ``` ```bash #!/bin/bash set -euo pipefail LOG_PATH="/var/log/test.log" # 标记:防止错误处理函数被重复调用 ERROR_HANDLED=0 # 错误处理函数 # 参数1:出错的行号 # 参数2:出错的命令(可选) error_handler() { # 如果已经处理过错误,直接退出(防止重复触发) if [ $ERROR_HANDLED -eq 1 ]; then return 1 fi ERROR_HANDLED=1 # 获取错误行号和错误码 local err_line=$1 local err_cmd=${2:-"未知命令"} local err_code=$? local current_time=$(date +"%Y-%m-%d %H:%M:%S") echo -e "\n[$current_time] 错误:脚本执行失败!" >> $LOG_PATH echo "错误行号:第 $err_line 行" >> $LOG_PATH echo "错误命令:$err_cmd" >> $LOG_PATH echo "错误码:$err_code" >> $LOG_PATH echo "错误描述:$(strerror $err_code 2>/dev/null || echo "未知错误")" >> $LOG_PATH echo -e "\n[$current_time] 错误:脚本执行失败!" echo "错误行号:第 $err_line 行" echo "错误命令:$err_cmd" echo "错误码:$err_code" echo "错误描述:$(strerror $err_code 2>/dev/null || echo "未知错误")" echo "脚本执行失败,详情请查看: $LOG_PATH" # 以错误码退出脚本(非0) exit $err_code } success_handler() { if [ $? -eq 0 ] && [ $ERROR_HANDLED -eq 0 ]; then echo -e "\n[$(date +"%Y-%m-%d %H:%M:%S")] 脚本执行完成(正常退出)" fi } # 配置陷阱:只捕获ERR信号(错误时触发),并传递行号和出错命令 # 使用BASH_COMMAND可以获取触发错误的具体命令 trap 'error_handler $LINENO "$BASH_COMMAND"' ERR # 配置EXIT陷阱(可选):仅用于正常退出的提示,不处理错误 trap 'success_handler' EXIT # ==================== 测试代码 ==================== echo "脚本开始执行..." # 故意制造错误:执行不存在的目录的ls命令(模拟出错场景) ls /不存在的目录 # 这一行执行失败,会触发错误处理 # 如果上面的命令执行成功(实际不会),才会执行下面的代码 echo "这行代码不会被执行..." ```