87 lines
2.3 KiB
Markdown
87 lines
2.3 KiB
Markdown
|
||
---
|
||
|
||
#复盘/0 #临时/备忘 #状态/待处理
|
||
|
||
20260204-备忘-主题名-文件内容
|
||
|
||
## 一句话描述
|
||
|
||
[__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 "这行代码不会被执行..."
|
||
```
|