如何忽略通过内置命令调用的命令失败?
How to ignore failure of command called through command builtin?
我有一个 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
内置函数,但在我的实际用例中,它是我无法控制的函数的一部分。)
为什么 command false || echo
失败了?
似乎这是 bash 4.0 以下版本中的错误。
我下载了 old versions 3.2.57 和 4.0,在 Linux 上编译了它们,运行 你的脚本。我可以在 3.2.57 中重现您的问题。在 4.0 中,一切都按预期工作。
St运行gely,我在 bash 的列表 list of changes 中找不到相应的注释,但是如果您搜索 set -e
,您会找到多个其他注释关于 set -e
在其他版本中的行为的错误修正,例如:
This document details the changes between this version, bash-4.4-rc1, and
the previous version, bash-4.4-beta.
[...]
o. Fixed a bug that caused set -e to be honored in cases of builtins invoking other builtins when it should be ignored.
如何解决问题?
最好的方法是使用更新版本的 bash。即使在 macOS 上,这也不成问题。您可以自己编译它或从 brew
.
之类的东西安装它
除此之外,您可以使用变通方法,例如省略 command
或添加子 shell ( command false; ) || echo ignore failure
(由 提供)。无论哪种情况,事情都会变得相当麻烦。因为您不知道错误发生的确切时间,所以您无法确定您每次都正确地解决了它。
我有一个 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
内置函数,但在我的实际用例中,它是我无法控制的函数的一部分。)
为什么 command false || echo
失败了?
似乎这是 bash 4.0 以下版本中的错误。
我下载了 old versions 3.2.57 和 4.0,在 Linux 上编译了它们,运行 你的脚本。我可以在 3.2.57 中重现您的问题。在 4.0 中,一切都按预期工作。
St运行gely,我在 bash 的列表 list of changes 中找不到相应的注释,但是如果您搜索 set -e
,您会找到多个其他注释关于 set -e
在其他版本中的行为的错误修正,例如:
This document details the changes between this version, bash-4.4-rc1, and the previous version, bash-4.4-beta.
[...]
o. Fixed a bug that caused set -e to be honored in cases of builtins invoking other builtins when it should be ignored.
如何解决问题?
最好的方法是使用更新版本的 bash。即使在 macOS 上,这也不成问题。您可以自己编译它或从 brew
.
除此之外,您可以使用变通方法,例如省略 command
或添加子 shell ( command false; ) || echo ignore failure
(由