可通过 set -o errtrace 和 trap 'echo "ERROR at $0:${FUNCNAME[0]:-top}:$LINENO: command failed with exit code $?" >&2' ERR 实现错误时自动打印脚本名、函数名、行号及退出码。

在 Linux Shell 脚本中,可以通过启用错误追踪(set -o errtrace)并结合 trap 捕获 ERR 信号,来实现出错时自动打印当前行号、函数名和脚本名。
启用 ERR trap 并捕获上下文信息
Shell 提供了几个内置变量可用于定位错误位置:
-
$LINENO:当前执行的行号 -
${FUNCNAME[0]}:当前最内层函数名(若在函数中);顶层脚本中为main或空字符串,建议用${FUNCNAME[0]:-top}安全取值 -
$0:当前脚本名 -
$?:上一条命令的退出状态(可在 trap 中读取,但注意需在 trap 内立即保存)
基础错误处理模板
将以下代码放在脚本开头即可全局生效:
#!/bin/bash
set -o errtrace
trap 'echo "ERROR at $0:${FUNCNAME[0]:-top}:$LINENO: command failed with exit code $?" >&2' ERR
说明:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
-
set -o errtrace确保函数内的错误也能触发ERRtrap -
&>2将错误信息输出到标准错误,避免干扰正常输出 -
${FUNCNAME[0]:-top}在非函数上下文中回退为top,更清晰标识脚本顶层
增强版:显示错误命令与堆栈(可选)
如需进一步调试,可扩展 trap 以打印出错命令本身:
trap 'echo "ERROR in $0:${FUNCNAME[0]:-top}:$LINENO: \"${BASH_COMMAND}\" (exit $?)">&2' ERR
$BASH_COMMAND 是 Bash 特有变量,实时记录当前正在执行的命令字符串。注意它在子 shell 或管道中行为受限,一般场景下足够可靠。
注意事项
以下情况需特别留意:
- 使用
||、&&、if等显式判断逻辑时,错误不会触发ERRtrap —— 因为 shell 认为这是你主动处理错误,不视为“未捕获异常” - 管道中的中间命令失败(如
cmd1 | cmd2 | cmd3),默认只报告最后一个命令的退出码;如需精确捕获,应启用set -o pipefail -
trap ... ERR对source进来的文件也生效,只要它们运行在同一个 shell 环境中


















