shell如何临时关闭错误退出

在 Shell 脚本(特别是在 Bash 中)中,**set +e 的作用就是关闭“遇到错误立即退出”的机制**。


set -eset +e 的区别

  • set -e(开启错误检查)
    告诉 Shell,如果脚本中任何一个命令执行失败(即返回了一个非零的退出状态码 exit status【非0】),脚本应该立即停止执行并退出。这就像开启了“严格模式”,常用于确保脚本的安全性,防止前面的步骤报错了,后面的步骤还在盲目执行。

  • set +e(关闭错误检查)
    告诉 Shell,即使某个命令执行失败,也不要理会它,继续执行接下来的每一行代码。


常见应用场景:全局严格,局部放行

在实际编写脚本时,我们经常会在脚本中灵活地切换这两个设置。比如,你希望脚本整体非常严格,但允许某一段特定的代码“犯错”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash

# 1. 开启严格模式:遇到任何错误立即退出
set -e

echo "开始执行核心任务..."
# 假设这里有很多重要的命令,如果失败必须停下来

# 2. 临时关闭错误检查
set +e
# 尝试删除一个可能不存在的临时文件,我们不在乎它成不成功
rm /tmp/maybe_not_exist_file.txt
# 即使上面 rm 报错了,脚本也会继续往下走

# 3. 重新开启错误检查,恢复严格状态
set -e

echo "继续执行其他核心任务..."

更好的替代方案

如果你开启了 set -e,但只是想让某一个命令即使失败也不触发脚本退出,频繁写 set +eset -e 会让代码显得有点臃肿。

你可以使用逻辑或操作符 || true 来优雅地解决:

1
2
3
4
5
6
set -e

# 即使文件不存在报错,因为后面接了 || true,整个表达式的最终结果也是“成功”
rm /tmp/maybe_not_exist_file.txt || true

echo "脚本不会退出,会继续执行这行"