Linux Shell脚本需启用set -euo pipefail严格模式,显式检查关键命令返回值,统一用非零码退出并输出stderr日志,结合trap清理资源,确保错误不静默、状态可追溯、流程可控。

Linux Shell 脚本异常退出时,若缺乏统一错误处理规范,容易导致任务静默失败、状态误判、日志缺失或级联故障。核心原则是:**主动检测、明确退出、记录上下文、避免掩盖错误**。
启用严格模式(set -euo pipefail)
这是最基础也最关键的防护。它让脚本在遇到未定义变量、命令失败、管道中任一环节出错时立即终止,而非继续执行错误逻辑:
-
set -e:任何命令返回非零状态即退出(但需注意
if、while、&&/||等上下文例外) - set -u:引用未声明变量时报错(防止拼写错误或空值误用)
- set -o pipefail:使管道整体返回最后一个失败命令的退出码(默认只看最后一个)
建议在脚本开头紧随 #!/bin/bash 后立即启用:
#!/bin/bash
set -euo pipefail
显式检查关键命令返回值
对影响流程安全的关键操作(如文件操作、服务调用、网络请求),不依赖 -e,而用 if 显式判断并提供可读错误信息:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 用
$?或直接在if中判断命令结果,避免“裸调用” - 错误信息应包含:失败命令、关键参数、上下文(如目标路径、时间戳)
- 必要时清理临时资源(如
trap 'rm -f "$tmpfile"' EXIT)
示例:
if ! cp "$src" "$dst"; then
echo "ERROR: Failed to copy $src to $dst at $(date)" >&2
exit 1
fi
统一错误退出与日志输出
所有错误退出应使用明确的非零退出码(推荐 1–127),并统一输出到 stderr:
- 用
echo "msg" >&2或printf "%s\n" "msg" >&2输出错误,避免污染 stdout - 避免用
exit -1(无效,shell 只认 0–255,负数会取模) - 可封装简单函数简化重复逻辑,如:
die() { echo "FATAL: $*" >&2; exit 1; }
...
[ -f "$conf" ] || die "config file missing: $conf"
捕获信号与清理资源(trap)
对可能被中断(Ctrl+C)、超时或崩溃的长时任务,用 trap 注册清理动作,确保状态一致:
- 常用信号:
INT(Ctrl+C)、TERM(kill)、EXIT(无论成功失败都触发) - 清理动作优先删除临时文件、释放锁、关闭连接等
- 避免在 trap 中调用复杂外部命令(可能不可用),优先用内置命令
示例:
tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT INT TERM

















