Bash 忽略shell脚本中的特定错误

Bash 忽略shell脚本中的特定错误,bash,shell,error-handling,Bash,Shell,Error Handling,我有一个shell脚本的小片段,它可能会抛出许多错误。我将脚本当前设置为在所有错误时全局停止。不过我想这一小段是略有不同的 以下是片段: recover database using backup controlfile until cancel || true; auto 我希望这最终会抛出一个“未找到文件”错误。但是,我希望继续执行此错误。对于任何其他错误,我希望脚本停止 实现这一目标的最佳方法是什么 Bash 3.00.16版为了防止Bash忽略特定命令的错误,您可以说: some-a

我有一个shell脚本的小片段,它可能会抛出许多错误。我将脚本当前设置为在所有错误时全局停止。不过我想这一小段是略有不同的

以下是片段:

recover database using backup controlfile until cancel || true; 
auto
我希望这最终会抛出一个“未找到文件”错误。但是,我希望继续执行此错误。对于任何其他错误,我希望脚本停止

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


Bash 3.00.16版

为了防止Bash忽略特定命令的错误,您可以说:

some-arbitrary-command || true
[[ $(some-arbitrary-command 2>&1) =~ "file not found" ]]
这将使脚本继续。例如,如果您有以下脚本:

$ 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
引自:

如果失败的命令是 紧跟在
关键字之后的命令列表,while
直到
if
语句中的测试,是在
和&
语句中执行的任何命令的一部分,或
|
列表,除了最后的
&
|
后面的命令之外,任何命令 在管道中,但在最后一个管道中,或者如果命令的返回状态为 用
倒过来。如果设置了
ERR
,则在shell之前执行陷阱 出口

编辑:为了更改行为,以便只有在执行作为错误一部分返回的
某个任意命令时才能继续执行,您可以说:

some-arbitrary-command || true
[[ $(some-arbitrary-command 2>&1) =~ "file not found" ]]
例如,执行以下操作(不存在名为
MissingFile.txt的文件):

这将产生以下输出:

$ bash foo 
1
2
rm: cannot remove `MissingFile.txt': No such file or directory
请注意,
echo 2
已执行,但
echo 3
未执行。

使用:

command || :
:是一个始终返回成功的bash内置程序。并且,如上所述,| |短路,因此仅当LHS出现故障(返回非零)时才执行RHS


上述使用“true”的建议也会起作用,但效率低下,因为“true”是一个外部程序。

有帮助吗?还有,欢迎来到SO!:)这确实有助于改进我的错误报告,但它不包括在不同庄园处理不同错误的任何内容。我实际上是在模仿c#的try{}catch{},这更像是对我的“set+e和set-e”用法的替代吗?我不确定我是否理解这是如何处理各种错误的。@Stunt这不是替代品。它只是意味着,如果在脚本开头有
set-e
,则不需要说
set+e
来忽略错误。说
command | | true
就足够了。这有助于清理我的代码(set+e和set-e可能会变得非常混乱!),但是它仍然在更一般的基础上处理错误。对于这个问题,我想检查错误,然后根据抛出的错误继续或退出。(看不出如何投票支持你的评论有帮助!)看起来这正是我需要的!然而,在测试它的语法错误时。这是我的测试:#/bin/bash set-u set-e foo(){rm MissingFile.txt}echo 1[[$(foo 2>&1)=~“没有这样的文件”]]echo 2这会产生一个“(”预期的错误。(我在这里使用了一个函数,因为我怀疑我的示例需要这样做)。很抱歉,我报告的错误应该是“(”意外的。它似乎在抱怨“(”之前的“foo”如果您运行
/bin/True
,True只是一个外部程序,因为
True
本身是bash的一个内置shell,就像echo和test一样,它也作为外部程序存在,但也是bash中的内置程序,如果您不给出完整路径,则将使用内置程序。