set -e 救不了你的脚本
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,排查能省很多时间。