juechafun/05-原子化笔记本/Linux-bash创建模板.md

2.2 KiB
Raw Blame History


#复盘/0 #临时/备忘 #状态/待处理

一句话描述

[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 "这行代码不会被执行..."