如果发生错误,则从shell脚本执行shell命令而不停止

Jor*_*geO 22 linux error-handling bash

在某种try/catch形式中,我想执行一个在发生错误时不会停止的bash.

特定的bash是:

#!/bin/sh

invoke-rc.d tomcat stop

rm -fr /var/webapps/
cp -R $WEBAPP /var/webapps/
invoke-rc.d tomcat start
Run Code Online (Sandbox Code Playgroud)

我想exec"invoke-rc.d tomcat stop",即使Tomcat没有运行,继续执行其他bash命令.

Tim*_*ost 31

尝试:

invoke-rc.d tomcat stop > /dev/null 2>&1 || true
Run Code Online (Sandbox Code Playgroud)

一点背景:

user@tower: # true
user@tower: # echo $?
0
user@tower: # false
user@tower: # echo $?
1

user@tower: # which true
/bin/true
user@tower: # which false
/bin/false
Run Code Online (Sandbox Code Playgroud)

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

有关取消设置/设置+ e的其他建议,请参阅此帖子.虽然它可以解决您的直接问题,但您可能会发现在自己的脚本中需要最近未设置的行为,尤其是在您复制文件时.

除了使Makefile在各种构建环境中表现得如预期之外,这是造成真假的最大原因之一.

另外,set + e不是完全可移植的,即某些版本的Solaris(甚至是Dash)..但我怀疑这是一个值得关注的问题.

  • @Toskan`>/dev/null`将`stdout`重定向到`/ dev/null`.`2>&1`将`stderr`重定向到`stdout`,有效地将'stdout`和`stderr`发送到空设备.`|| true`确保命令以零状态退出,即使它失败也是如此.这就像说*如果这不起作用,运行/ bin/true并返回该值而不是*.这是一个合乎逻辑的"OR".例如`[-d/etc] || echo"你的系统坏了"`(如果/ etc不是目录,回显一下). (2认同)

Ada*_*eld 28

禁用"立即退出"选项set +e,运行您的命令,然后可选择重新启用它set -e:

set +e
invoke-rc.d tomcat stop
set -e  # optional
Run Code Online (Sandbox Code Playgroud)

有关内置及其所有各种选项(其中有许多选项)的说明,请参阅Bash手册的第4.3.1节set.