2009-07-02 572 views
22

在某种try/catch形式中,我想执行一个bash,如果发生错误时不会停止。如果发生错误,从shell脚本执行shell命令而不停止

具体是bash:

#!/bin/sh 

invoke-rc.d tomcat stop 

rm -fr /var/webapps/ 
cp -R $WEBAPP /var/webapps/ 
invoke-rc.d tomcat start 

我想给exec “援引-tomcat的的rc.d停止” 即使Tomcat没有运行,继续执行其他的bash命令。

+6

是不是bash的默认行为?我可以发誓它(如果某些命令失败,则需要采取明确措施终止脚本...) – 2009-07-02 15:35:52

+0

如果您执行此脚本且tomcat未运行,则脚本将自第一条命令返回错误以后停止执行。我希望脚本继续。 – JorgeO 2009-07-02 15:38:29

+0

@Alex:默认设置,但有可能会覆盖默认设置。 – 2009-07-02 16:23:47

回答

28

尝试:

invoke-rc.d tomcat stop > /dev/null 2>&1 || true 

一点背景:

[email protected]: # true 
[email protected]: # echo $? 
0 
[email protected]: # false 
[email protected]: # echo $? 
1 

[email protected]: # which true 
/bin/true 
[email protected]: # which false 
/bin/false 

真正解决方案是在看tomcat的启动脚本,看看它是如何知道如果Tomcat运行:)这样,你不要不必要地纠缠它。

请参阅this post关于另一个建议unset/set + e。虽然它可以解决您的紧急问题,但您可能会发现在自己的脚本中需要最近未设置的行为,特别是在您正在复制文件时。

这是制作真假的最大原因之一,不同于让Makefiles在各种构建环境中按预期行事。

另外,set + e并不是完全可移植的,也就是某些版本的Solaris(甚至Dash)..但我怀疑这是您的问题。

-3

尝试将标准错误重定向到文件...像2> myerror。

4

使用bash's set command可暂时禁用非零退出行为。

set +e 
invoke-rc.d tomcat stop 
set -e 
28

set +e禁用“立即退出”选项,运行命令,然后任选set -e重新启用它:

set +e 
invoke-rc.d tomcat stop 
set -e # optional 

set内建的说明,请参见Bash的手册section 4.3.1和它的各种选择(其中有很多)。

1

如果调用-tomcat的的rc.d停止是要防止失败,也许调用-tomcat的的rc.d停止的唯一的事||真的可以做到吗?那永远不会有非零退出状态。