set -euo pipefail
是 Bash 脚本中提高健壮性和错误检测能力的一个 “三件套”配置。它能帮你快速发现错误、防止脚本静默失败,尤其适用于自动化运维脚本、备份任务等场景。
-e
:遇到错误立即退出(exit on error)
如果脚本中的某条命令返回非 0(失败),整个脚本就会立即退出。
这能防止后续命令在不正确的状态下继续运行。
示例:
set -e
cp not_exist.txt /tmp/
echo "this will not run" # 永远不会执行
-u
:引用未定义变量时报错(undefined variable is an error)
如果你引用了一个未定义的变量(如 $UNDEFINED_VAR
),脚本会立刻报错并退出,而不是当作空字符串继续执行。
示例:
set -u
echo "value: $UNDEFINED_VAR" # 报错并退出
-o pipefail
:管道中任一命令失败则整个管道失败
默认情况下,像 cmd1 | cmd2 | cmd3
这样的管道语句,只会关注最后一个命令的返回值。
加上 pipefail
后,只要其中任意一个命令失败,整个管道就会返回非 0,脚本会因此中止(配合 -e
生效)。
示例:
set -eo pipefail
false | true # 默认情况下不会失败,但加了 pipefail 会让整个管道失败
总结下:
配置项 | 作用 | 风险防御 |
---|---|---|
-e | 出错退出 | 防止错误被忽略 |
-u | 未定义变量时报错 | 防止拼写错误或漏设变量 |
-o pipefail | 管道中任一命令失败即失败 | 保证数据链条正确性 |
建议:
在你写的 生产脚本 / 备份脚本 / 部署脚本 中,一律建议加上这句:
set -euo pipefail
这样即便你漏判断 if
或者命令失败,也不会继续执行后续操作造成数据误删或上传错误。