我有一小段 shell 脚本,它有可能引发许多错误。我将脚本当前设置为全局停止所有错误。但是,我希望这个小部分略有不同。
这是片段:
recover database using backup controlfile until cancel || true;
auto
我希望这最终会引发“找不到文件”错误。但是我想继续执行这个错误。对于任何其他错误,我希望脚本停止。
实现这一目标的最佳方法是什么?
重击版本 3.00.16
我有一小段 shell 脚本,它有可能引发许多错误。我将脚本当前设置为全局停止所有错误。但是,我希望这个小部分略有不同。
这是片段:
recover database using backup controlfile until cancel || true;
auto
我希望这最终会引发“找不到文件”错误。但是我想继续执行这个错误。对于任何其他错误,我希望脚本停止。
实现这一目标的最佳方法是什么?
重击版本 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
从手册中引用:
如果失败的命令是紧跟在
while
oruntil
关键字之后的命令列表的一部分、if
语句中测试的一部分、在 a&&
或||
列表中执行的任何命令的一部分(除了最后一个&&
or之后的||
命令、在一个管道,但最后一个,或者如果命令的返回状态正在与!
. 如果设置了陷阱ERR
,则会在 shell 退出之前执行。
编辑:为了改变行为,以便只有在执行作为错误的一部分返回时才继续执行,您可以说:some-arbitrary-command
file 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
。
利用:
command || :
: 是一个 bash 内置,总是返回成功。而且,如上所述,|| 短路,因此仅当 LHS 失败(返回非零)时才执行 RHS。
上述使用 'true' 的建议也可以,但效率低下,因为 'true' 是一个外部程序。