忽略 shell 脚本中的特定错误

2024-04-16

我有一小段 shell 脚本,它可能会引发许多错误。我当前将脚本设置为在出现所有错误时全局停止。不过我希望这个小部分略有不同。

这是片段:

recover database using backup controlfile until cancel || true; 
auto

我预计这最终会引发“文件未找到”错误。但是我想继续执行这个错误。对于任何其他错误,我希望脚本停止。

实现这一目标的最佳方法是什么?

bash 版本 3.00.16


为了使 bash 忽略特定命令的错误,你可以说:

some-arbitrary-command || true

这将使脚本继续。例如,如果您有以下脚本:

$ cat foo
set -e
echo 1
some-arbitrary-command || true
echo 2

执行它会返回:

$ bash foo
1
z: line 3: some-arbitrary-command: command not found
2

在缺少...之下|| true在命令行中,它会生成:

$ bash foo
1
z: line 3: some-arbitrary-command: command not found

引用自manual http://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin:

如果失败的命令是命令的一部分,则 shell 不会退出 紧接着命令列表while or until关键字,部分 测试在if语句,在 a 中执行的任何命令的一部分&& or ||列出除了最后一个命令之外的命令&& or ||,任意命令 在管道中但最后一个,或者如果命令的返回状态是 倒置与!。一个陷阱ERR,如果设置,则在 shell 之前执行 退出。

编辑:为了改变行为,以便执行应该继续only if执行some-arbitrary-commandfile not found作为错误的一部分,您可以说:

[[ $(some-arbitrary-command 2>&1) =~ "file not found" ]]

例如,执行以下命令(没有名为MissingFile.txt存在):

$ cat foo 
#!/bin/bash
set -u
set -e
foo() {
  rm MissingFile.txt
}
echo 1
[[ $(foo 2>&1) =~ "No such file" ]]
echo 2
$(foo)
echo 3

这会产生以下输出:

$ bash foo 
1
2
rm: cannot remove `MissingFile.txt': No such file or directory

注意echo 2被处决但是echo 3 wasn't.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

忽略 shell 脚本中的特定错误 的相关文章

随机推荐