web-dev-qa-db-ja.com

エラーが発生しても停止せずにシェルスクリプトからシェルコマンドを実行する

一種の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

「invoke-rc.d Tomcat stop」を実行したいのですが、Tomcatが実行されていなくても、他のbashコマンドを実行し続けます。

22
JorgeO

試してください:

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

少し背景:

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

realソリューションは、Tomcatが実行されているかどうかを確認するために、Tomcatの初期化スクリプトを調べています。

+ eの設定を解除/設定する他の提案については この投稿 を参照してください。それはあなたの当面の問題を解決しますが、特にファイルをコピーしているので、あなた自身のスクリプトで最近未設定の動作が必要であることに気付くかもしれません。

これは、さまざまなビルド環境でMakefileが期待どおりに動作することを除いて、trueとfalseが作成された最大の理由の1つです。

また、set + eは完全に移植可能ではありません。つまり、一部のバージョンのSolaris(さらにはDash)でもありますが、これがあなたにとって問題であるとは思えません。

31
Tim Post

set +eで「すぐに終了」オプションを無効にし、コマンドを実行してから、オプションでset -eで再度有効にします。

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

組み込みのsetとそのさまざまなオプション(多数あります)のすべてについては、Bashマニュアルの セクション4.3.1 を参照してください。

28
Adam Rosenfield

bashのsetコマンド を使用して、exit-on-nonzero動作を一時的に無効にします。

set +e
invoke-rc.d Tomcat stop
set -e
4
xyzzy

もし invoke-rc.d Tomcat停止 失敗から保護したい唯一のものです invoke-rc.d Tomcat stop ||本当 できますか?それは決してゼロ以外の終了ステータスを持つべきではありません。

1
Vatine