2.3 KiB
2.3 KiB
#复盘/0 #临时/备忘 #状态/待处理
20260204-备忘-主题名-文件内容
一句话描述
[bash 脚本规范/模板____]
#!/bin/bash
set -ueo pipefail
#!/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 "这行代码不会被执行..."