Bash 忽略shell脚本中的特定错误
我有一个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
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中的内置程序,如果您不给出完整路径,则将使用内置程序。