【发布时间】:2021-09-09 14:43:49
【问题描述】:
我有一个 shell 脚本(在带有 GNU bash 的 macOS 上运行,版本 3.2.57(1)-release),一开始我是 set -e,但我也想忽略一些潜在的故障,以便它们不要结束脚本的执行。我通过将|| ... 附加到相关命令来做到这一点:
#!/bin/sh
set -e
false || echo ignore failure
上述工作并按预期输出ignore failure。
但是,如果我通过内置的 command 调用 false 命令,则此策略不起作用 - 一旦 false 失败,以下版本的脚本就会退出,而不打印任何内容:
#!/bin/sh
set -e
command false || echo ignore failure
这是为什么呢?即使在第二种情况下,我如何才能获得忽略失败的期望行为?
(在这个简化的示例中,我当然可以删除 command 内置函数,但在我的实际用例中,它是我无法控制的函数的一部分。)
【问题讨论】:
-
sh(Bourne-shell) 通常不是bash(Bourne-again shell)。 -
您使用哪种外壳? bash、sh 还是 zsh?
-
我想知道它是否将
||解析为false的参数。( command false ) || echo ignore failure更好吗?如果你这样做command echo hello || echo goodbye会发生什么? -
@Abelisto 我知道,我正在使用
set -e,因为我通常希望在失败时停止执行(在示例压缩的原始脚本中)。但是有一些命令我没有,这就是我使用|| ...的目的。 -
@Cyrus 在 macOS 上,它们都是 bash(版本 3.2.57(1)-release),但我尝试同时运行脚本,以防 bash 改变行为取决于它以什么程序名称运行。两种情况下的结果都是一样的。