Shell 脚本默认容错性强(出错继续执行),这在自动化场景反而是隐患。用 set 命令可以让脚本更严格、更易调试。
一、问题:默认行为不安全
下面这段,如果 cd 失败,rm 仍会执行,可能误删:
cd /some/dir
rm *.tmp # 若 cd 失败,会在当前目录误删!
二、set -e:遇错即停
#!/bin/bash
set -e # 任何命令返回非零立即退出
cd /some/dir # 失败则脚本终止
rm *.tmp
set -e 是写健壮脚本的第一步:错误能被及时发现,而不是被悄悄忽略导致连锁问题。
三、set -x:打印执行的命令
set -x # 打印每条命令(前面带 + 号)
调试时极有用,能看到脚本到底执行了什么、变量展开成什么。
四、组合:set -euxo pipefail
生产脚本推荐的"黄金开头":
#!/bin/bash
set -euo pipefail
-e:出错即停-u:使用未定义变量报错-o pipefail:管道中任一命令失败则整条失败
五、调试技巧
bash -x script.sh:运行时开启跟踪,不用改脚本bash -n script.sh:只检查语法不执行- 在可疑位置加
set -x/set +x局部跟踪
六、安全检查清单
- 变量加引号:
"$VAR"防空格/特殊字符 - 路径用绝对路径,避免依赖当前目录
- 重要操作前先 echo 一遍确认
- 用
trap捕获退出做清理
七、小结
一个 set -euo pipefail 能让 Shell 脚本的健壮性大幅提升。写脚本时养成这个习惯,能省去大量调试时间。