Plainnotes

set -e 救不了你的脚本

2025-10-08 · 3 分钟工具

set -e 看起来是“出错就退出”,实际上有一堆例外。

管道里只有最后一个命令的退出码算数:

false | true
echo "still here"

set -e 不会退出,因为 true 成功了。要抓管道里任何一个失败,得开 set -o pipefail。

放在 if、while、&&、|| 里的命令,-e 也不生效——这是 POSIX 的规定,不是 bug。

子 shell 里 set -e 不一定继承,(false; echo ok) 照样输出 ok。

所以完整的写法是:

set -euo pipefail

-u 管未定义变量,pipefail 管管道,-e 管普通命令。再加个 trap 'echo "failed at $LINENO"' ERR,排查能省很多时间。