脚本运行过程中某条命令执行失败怎么避免错误蔓延结束运行
一、问题场景
脚本运行过程中某条命令运行失败了(比如目录突然权限变了),脚本还会继续往下执行吗?
答案:会,因为Bash默认不会因为一条命令失败而停止的。
问题:如果脚本里面涉及危险操作的话,那后果可能很严重。
二、解决办法
set -euo pipefail # e:出错停 u:变量未定义报错 o:管道命令失败也停
这行命令代表的该脚本具备一定的容错且要求严格:
- 任何命令出错就停止(防止错误蔓延);
- 任何变量必须先定义后使用(防止空变量带来灾难);
- 管道命令中只要有一个环节出错,就算整体失败(防止错误被管道末尾掩盖)。
三、案例解释
这里通过对比添加该命令与不添加该命令来体会这行命令的作用。
3.1 实验环境:
- first.sh :这个脚本是不添加set -euo pipefail
- firstV1.0.sh:这个脚本是添加了set -euo pipefail
- log-2026-04-18.log:验证使用的日志文件
3.2 实验过程:
3.2.1 实验一描述:
首先看下first.sh这个脚本,脚本的功能是切换到指定目录/not/exist 然后删除log-2026-04-18.log的日志文件。其中切换的目录是不存在的,验证是否会把脚本所在目录/usr/local/safe的重名日志文件log-2026-04-18.log删除?
# cat first.sh
#!/bin/bash
# 没有 set -e
cd /not/exist # 这条命令会失败
rm -rf log-2026-04-18.log # 但这条还会执行!危险!
3.2.2 实验一执行过程:

3.2.3 实验一执行结果:
通过观察执行过程,虽然提示了./first.sh: line 3: cd: /not/exist: No such file or directory,但脚本还是往下执行了rm -rf log-2026-04-18.log 删除的操作,导致脚本所在目录/usr/local/safe下的log-2026-04-18.log日志文件被删除,形成了错误蔓延的情况。假设如果脚本里面包含其他危险操作造成的错误将会更加严重。
3.2.4 实验二描述:
接下来看下firstV1.0.sh这个脚本,脚本的功能和first.sh是一样的。不一样的地方是在脚本的头部添加了set -euo pipefail这个命令,执行脚本验证是否会把脚本所在目录/usr/local/safe的重名日志文件log-2026-04-18.log删除?
# cat firstV1.0.sh
#!/bin/bash
# 添加异常退出脚本运行
set -euo pipefail
cd /not/exist # 这条命令会失败
rm -rf log-2026-04-18.log #这条命令不会执行
3.2.5 实验二执行过程:

3.2.6 实验二执行结果:
通过观察执行过程,可以看到在脚本执行出现错误的时候,脚本就停止了执行/usr/local/safe下的log-2026-04-18.log日志文件没有被删除,仍然保留着,避免了错误蔓延。
3.3 实验结论:
通过上面的对比,可以看到在脚本中添加set -euo pipefail后可以避免当脚本出错的形成错误蔓延的情况。
四、相关语法
1.set -e (errexit)
作用:任何命令失败(返回值 ≠ 0)时立即退出脚本。可以记忆为“出错就停”
危险场景:
# 没有 -e:cd 失败后仍执行 rm,可能误删文件
cd /不存在的目录
rm -rf *
2.set -u (nounset)
作用:使用未定义变量时报错退出。可以记忆为“变量必须有值”
危险场景:
# 没有 -u:未传参数时 $1 是空字符串
rm -rf /tmp/$1 # 变成 rm -rf /tmp/
3.set -o pipefail
作用:管道中任一命令失败,整个管道就算失败。可以记忆为“管道不掩盖错误”
对比:
# 没有 pipefail:只检查最后一个命令
cat 不存在.txt | wc -l # 返回 0(成功)
# 有 pipefail:cat 失败就返回失败
cat 不存在.txt | wc -l # 返回 cat 的错误码
4.其他常用选项
|
选项 |
全称 |
作用 |
记忆口诀 |
使用场景 |
|
set -x |
xtrace |
执行前打印命令(变量展开后) |
跟踪执行 |
调试脚本 |
|
set -v |
verbose |
打印原始输入行 |
显示源码 |
语法检查 |
|
set -n |
noexec |
只检查语法不执行 |
空运行 |
检查语法错误 |
|
set -f |
noglob |
禁用通配符 * ? [] |
禁用通配 |
处理特殊文件名 |
|
set -C |
noclobber |
禁止重定向覆盖文件 |
保护文件 |
防止误覆盖 |
|
set +o |
显示所有选项状态 |
查看当前配置 |
五、总结
本文主要记录脚本运行过程中某条命令执行失败使用添加set -euo pipefail避免错误蔓延结束运行的学习笔记。
写在最后
关于本文
作为技术成长路上的记录,文中难免存在理解不深或表述不当之处,欢迎各位前辈指正。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)