linux中用trap捕获脚本异常的核心是err伪信号配合set -o errtrace(或set -e),使函数内错误也能触发处理函数;需避免if条件、子shell、管道等场景失效,并搭配exit trap做兜底清理,调试时可用debug trap定位问题。

Linux 中用 trap 捕获脚本运行异常,核心是利用 ERR 伪信号配合 set -o errtrace(或 set -E),让错误发生时自动触发清理或诊断逻辑。
用 ERR 捕获命令失败
ERR 不是操作系统信号,而是 Shell 自定义的“错误事件”:任意命令返回非零退出状态时触发。但默认只在主脚本层级生效,函数内不继承。
- 启用函数内继承:开头加 set -o errtrace 或 set -E
- 定义错误处理函数,比如记录行号、命令和退出码:
error_handler() {
echo "❌ Error at line $BASH_LINENO[0]: '$BASH_COMMAND' → exit code $?"
# 可追加日志、发告警、清理资源
exit 1
} - 注册 trap:
trap error_handler ERR
确保 ERR 在所有上下文生效
常见陷阱是函数里报错却不触发 trap。除了 set -E,还需注意:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 避免在 if/while 条件中直接执行可能失败的命令(如 if false; then ... 不会触发 ERR)
- 子 shell(括号包裹的命令)默认不继承 trap,需显式导出函数:
export -f error_handler
(trap error_handler ERR; some_command) - 管道中的错误默认只检查最后一个命令,要用 set -o pipefail 让任一环节失败都触发 ERR
搭配 EXIT 做兜底清理
ERR 能捕获中间错误,但无法覆盖语法错误、未定义变量等导致脚本提前退出的情况。所以推荐组合使用:
- 用 trap 'cleanup_func' EXIT 确保无论怎么退出,临时文件、锁、后台进程都能释放
- cleanup_func 和 error_handler 可复用同一套清理逻辑,避免重复代码
- 注意:EXIT trap 在脚本正常结束、被信号中断、或 ERR 触发 exit 后都会执行
调试时启用 DEBUG 信号
若异常难以复现,可临时加 DEBUG trap 输出每步执行情况:
- trap 'echo "[DEBUG] Line $LINENO: $BASH_COMMAND"' DEBUG
- 它会在每个命令执行前打印行号和命令内容,适合定位卡死、跳过或逻辑错乱问题
- 上线前务必移除或注释,否则影响性能和日志清晰度










