set -euo pipefail 是生产环境 Shell 脚本的强制底线配置:-e 防命令失败被忽略,-u 防未定义变量误用,-o pipefail 防管道中间环节静默失败,三者协同实现“出错立刻停”,避免连锁误操作。

在 Linux Shell 脚本中,set -euo pipefail 是提升脚本健壮性的核心手段,不是可选配置,而是生产环境的底线要求。它让脚本从“出错继续跑”变成“出错立刻停”,避免因一个命令失败引发连锁误操作(比如删错目录、上传空文件、跳过关键校验)。
脚本开头必须加这行
把它放在 #!/bin/bash 下一行,且必须是最早执行的语句之一:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
#!/bin/bash set -euo pipefail
注意:
- 不要写成 set -e -u -o pipefail(中间带空格会报错);
- 不要漏掉 o,set -eu pipefail 是错误写法,pipefail 必须和 -o 搭配;
- 如果脚本用 /bin/sh 启动,该设置可能不生效(部分 sh 不支持),务必用 #!/bin/bash 并确认解释器版本。
每个选项实际防什么坑
-e:防止命令失败被忽略
- 例如 cp /src/file /dst/ 权限不足失败 → 后续 rm /src/file 不会执行,避免“复制没成功却删源文件”。
-u:防止变量名写错或漏赋值
- 例如本意写 $CONFIG_PATH 却误写成 $CONFIG_DIR → 脚本直接报错退出,而不是把空值传给 cd 导致进入根目录。
-o pipefail:防止管道中间环节静默失败
- 例如 curl -s "$API" | jq '.status' | grep "ok",若 curl 因网络超时失败,没加 pipefail 时 jq 会收到空输入并返回 0,整个管道看似成功;加了之后,curl 失败即中断,后续不会执行。
允许个别命令失败的处理方式
不能全局关掉严格模式,而是按需局部绕过:
- 用
|| true:适合明确知道失败也无害的场景killall myapp || true # 进程可能本来就没在运行 - 临时关闭再恢复:
set +e<br> dangerous_command<br> exit_code=$?<br> set -e<br> if [ $exit_code -ne 0 ]; then ... fi
- 用
${var?提示信息}替代裸变量引用,既利用-u又给出清晰报错cp "$SRC_FILE" "${DST_DIR?DST_DIR 未设置}/backup.txt"
配合其他防护更稳妥
仅靠 set -euo pipefail 不够,建议同步做这几件事:
- 开头检查必要命令是否存在:
command -v curl >/dev/null || { echo "curl 缺失"; exit 1; } - 敏感操作前加 dry-run 模式开关,或先打印将执行的命令再确认
- 用
trap 'cleanup' EXIT INT TERM注册清理函数,确保异常退出时也能释放锁、删临时文件 - 所有外部输入(如参数、配置文件)做非空和格式校验,别只依赖
-u

















