当前位置: 首页 > 知识库问答 >
问题:

bash中'set-e'的例外[重复]

申屠森
2023-03-14

我有一个bash脚本用于制作我的项目。我在脚本顶部设置了set-e,以便在任何组件出现故障时中断执行。

其中一个命令会失败,但它失败是很自然的。我希望脚本表现为:

  • 运行脚本。
  • 到达并运行有问题的命令。
  • 如果失败,不要中断执行。仅为此命令执行此操作。

共有2个答案

乌骏
2023-03-14

标志set-e有一系列豁免,在执行命令失败(exitcode)后,它不会立即导致中止≠ 0). 其中包括@cyrus提出的连接(a | | b和类似的连接)。有关详细信息,请参见manbash;这很难找到,也许这有帮助:

man bash | grep -B 20 -A 10000 'Exit.*immediately' | less

我的建议是将其放在中,如果

if command
then
    : "worked nicely"
else
    : "failed, but we don't want to abort"
fi

或者@Cyrus的简短版本:

command || true  # do not abort in case of 'set -e'
汪文光
2023-03-14

我建议:

set +e
# your command which would fail
set -e

your_command_which_would_fail || true
 类似资料:
  • 在bash脚本中,有什么用 ? 我认为这与环境变量有关,但我以前从未遇到过

  • 问题内容: 我正在研究脚本从该脚本的Debian存档(.deb)文件解压缩之前执行的 preinst 文件的内容。 该脚本具有以下代码: 我的第一个查询是关于这一行的: 我认为脚本的其余部分非常简单:它检查Debian / Ubuntu软件包管理器是否正在执行安装操作。如果是,它将检查我的应用程序是否刚刚安装在系统上。如果已安装,脚本将显示消息 “ MyApplicationName已安装” 并结

  • 我的第一个问题是关于行: 我认为脚本的其余部分非常简单:它检查Debian/Ubuntu包管理器是否正在执行安装操作。如果是,它会检查我的应用程序是否刚刚安装到系统上。如果有,脚本将打印消息“MyApplicationName is just installed”并结束(表示以“error”结束,不是吗?)。 如果用户正在要求Debian/Ubuntu包系统安装我的包,脚本也会删除两个目录。

  • 问题内容: 在Set的Java文档中,它在方法的规范中说,例如(我强调) add(E e) 将指定的元素添加到此集合(如果尚不存在) (可选操作) 。 可选在这里是什么意思? 那如果我使用SUN / Oracle以外的JVM,那么该Java实现可能不提供此操作吗? 问题答案: 是一个接口。实现该接口的类不一定需要提供可选操作的实现。 我认为这些可选操作可以回到通用界面,在通用界面中,操作被设置为可

  • 使用有什么区别吗: 从bash手册页上可以看出,它们是相同的,唯一的区别是,从用户角度来看,第二种格式更明确。

  • 我有一个bash脚本,我想全局启用set-e。 但是,与其一直禁用它并重新启用它,我想知道是否有一种方法可以有时选择性地禁用错误处理。例如,从systemd运行的命令可以在前面加上一个减号来忽略错误。bash有等效的吗? e. g. 由于需要启用/禁用很多,我不想继续执行以下操作: