set -e 使脚本在命令返回非零退出码时立即终止,须置于 shebang 后首行;需搭配 set -u 和 set -o pipefail,并用 trap 处理清理。

在 Linux 运维脚本中,用 set -e 实现“报错立即退出”,关键不是加了就完事,而是要理解它生效的边界和常见陷阱。它的作用是:**只要某条命令返回非零退出码,脚本立刻终止**,避免错误被忽略后继续执行造成更严重后果(比如删错目录、覆盖配置、启动失败的服务被当成成功)。
必须放在脚本开头立即启用
set -e 只对它之后的命令起作用。如果写在中间或函数里,前面的命令仍可能静默失败。
- ✅ 正确写法(第一行 shebang 后紧接):
#!/bin/bash
set -e - ❌ 错误写法:
#!/bin/bash
echo "准备初始化"
set -e # 此时前面的 echo 已执行,且无法回滚
配合 set -u 和 set -o pipefail 才算完整防护
单独 set -e 不能捕获所有风险。实际运维脚本建议三者组合使用:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
set -u:变量未定义就报错(比如把
$USER_NAME写成$USERNAME,不设 -u 就会悄无声息展开为空,导致路径错误) -
set -o pipefail:让管道
cmd1 | cmd2中任意一环失败都触发退出(默认只看 cmd2 的退出码,cmd1 失败会被吞掉) - 常用写法:
set -euo pipefail
允许个别命令失败?得有明确写法
不是所有命令都该“失败即停”。比如检查某个进程是否存在,失败是正常预期。
- 用
|| true显式忽略结果:
kill $(cat /var/run/myapp.pid) 2>/dev/null || true - 临时关闭再恢复(适合多行逻辑):
set +e
some_command_that_may_fail
set -e - 注意:
if、while、&&/||结构内,set -e 默认不触发退出——这是设计行为,不是 bug
别忘了配套 trap 清理残留
set -e 能让脚本“及时停”,但停得突然,可能留下临时文件、挂载点、锁等。必须用 trap 确保退出前清理:
- trap 'rm -f /tmp/myapp.lock; umount /mnt/temp 2>/dev/null' EXIT INT TERM
- 尤其注意
EXIT是必选信号,覆盖正常结束和异常中断两种情况 - 清理命令本身也建议加
2>/dev/null避免因清理失败再次触发 set -e

















