我有一小段shell脚本,可能会抛出很多错误。我有脚本当前设置为全局停止所有错误。不过我希望这个小小的部分略有不同。
以下是摘录:
recover database using backup controlfile until cancel || true;
auto
我期待这最终会抛出“找不到文件”错误。但是,我想继续执行此错误。对于任何其他错误,我希望脚本停止。
实现这一目标的最佳方法是什么?
Bash版本3.00.16
答案 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不会退出 紧跟
while
或until
关键字后的命令列表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;也会工作,但效率低,因为“真实”。是一个外部程序。