忽略shell脚本中的特定错误

时间:2013-07-24 09:38:53

标签: bash shell error-handling

我有一小段shell脚本,可能会抛出很多错误。我有脚本当前设置为全局停止所有错误。不过我希望这个小小的部分略有不同。

以下是摘录:

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

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

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

Bash版本3.00.16

2 个答案:

答案 0 :(得分:90)

为了防止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

的引用
  

如果失败的命令是shell的一部分,则shell不会退出   紧跟whileuntil关键字后的命令列表   if语句中的测试,是&&||中执行的任何命令的一部分   &&列表除了最终||!之后的命令,任何命令   在管道中但是最后一个,或者命令的返回状态是什么   与ERR倒置。 some-arbitrary-command上的陷阱(如果已设置)将在shell之前执行   退出。

编辑:为了改变行为,只有在执行file not found作为错误的一部分返回[[ $(some-arbitrary-command 2>&1) =~ "file not found" ]] 时,才能继续执行,您可以说:< / p>

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已执行但{{1}}未执行。

答案 1 :(得分:20)

使用:

--env=prod

:是一个内置的bash,总能返回成功。并且,如上所述,||短路因此只有在LHS失效时才会执行RHS(返回非零)。

以上建议使用&#39; true&#39;也会工作,但效率低,因为“真实”。是一个外部程序。