86

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

这是片段:

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

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

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

重击版本 3.00.16

4

2 回答 2

172

为了使 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

手册中引用:

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

编辑:为了改变行为,以便只有在执行作为错误的一部分返回时才继续执行,您可以说: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

于 2013-07-24T09:49:06.647 回答
39

利用:

command || :

: 是一个 bash 内置,总是返回成功。而且,如上所述,|| 短路,因此仅当 LHS 失败(返回非零)时才执行 RHS。

上述使用 'true' 的建议也可以,但效率低下,因为 'true' 是一个外部程序。

于 2015-10-30T01:43:45.077 回答