set -euo pipefail 也会骗你
set -e 的规则是:简单命令失败就退出。但它会放过很多东西——管道里只有最后一个命令的退出码算数(除非开 pipefail),命令放在 if 或 && 里不会被检查,子 shell 里的失败也可能被吞掉。
最典型的坑是 foo=$(bar) 之后紧跟 echo:如果 bar 失败,赋值语句本身返回非零,set -e 确实会退出。但一旦你写成 foo=$(bar) || true,失败就被静默掉了,而人往往以为 true 只是兜底。
另一个坑是函数返回值。函数最后一条命令是 echo,那函数永远返回 0,里面的失败全被掩盖。所以在函数里要显式 return,或者把关键命令的退出码单独判断。
结论不是放弃严格模式,而是知道它的边界:关键步骤显式判断退出码、管道两端都要检查、变量一律用 ${x:?} 或 ${x:-默认值} 而不是裸引用。