
---

#复盘/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 "这行代码不会被执行..."
```
