dlu*_*kes 5 unix macos bash shell sh
我有一个 shell 脚本(在 macOS 上运行 GNU bash,版本 3.2.57(1)-release)set -e,但我也想忽略一些潜在的失败,这样它们就不会结束执行的脚本。我通过附加|| ...到相关命令来做到这一点:
#!/bin/sh
set -e
false || echo ignore failure
Run Code Online (Sandbox Code Playgroud)
ignore failure如预期的那样,上述工作和输出。
但是,如果我false通过command内置命令调用该命令,则此策略不起作用 - 脚本的以下版本会在false失败后立即退出,而不打印任何内容:
#!/bin/sh
set -e
command false || echo ignore failure
Run Code Online (Sandbox Code Playgroud)
这是为什么?即使在第二种情况下,我怎样才能获得忽略失败的期望行为?
(在这个简化的示例中,我当然可以删除command内置函数,但在我的实际用例中,它是我无法控制的函数的一部分。)
command false || echo失败?看来这是 4.0 以下 bash 版本中的一个错误。
我下载了旧版本3.2.57 和 4.0,在 Linux 上编译它们,然后运行你的脚本。我可以在 3.2.57 中重现你的问题。在 4.0 中,一切都按预期进行。
奇怪的是,我在 bash 的更改列表中找不到相应的注释,但是如果您搜索,set -e您会发现有关其他版本中的行为的多个其他错误修复set -e,例如:
本文档详细介绍了此版本 bash-4.4-rc1 与之前版本 bash-4.4-beta 之间的更改。
[...]
哦。修复了一个错误,该错误导致在内置函数调用其他内置函数(而应忽略它)的情况下,会导致 set -e 被遵守。
最好的方法是使用更新版本的 bash。即使在 macOS 上,这也不应该成为问题。您可以自己编译它或从类似的东西安装它brew。
除此之外,您可以使用诸如省略command或添加子 shell 之类的解决方法(由Nate Eldredge( command false; ) || echo ignore failure提供)。无论哪种情况,事情都会变得相当麻烦。由于您不知道错误何时发生,因此无法确定每次都正确解决了该问题。
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |