2009-07-02 12 views
22

一種のtry/catchフォームで、エラーが発生した場合に停止しないbashを実行します。エラーが発生した場合にシェルスクリプトからシェルコマンドを実行します。

特定のbashは次のとおりです。私は、「起動-rc.dのTomcatの停止」およびTomcatが実行されていない場合でも、他のbashのコマンドを実行し続けるexecしたい

#!/bin/sh 

invoke-rc.d tomcat stop 

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

+6

bashのデフォルトの動作ではありませんか?私はそれを誓ったことがあります(コマンドが失敗した場合にスクリプトを終了するために明示的な処置を取る必要があります...) –

+0

このスクリプトを実行すると、tomcatが実行されていないと、最初のコマンドがエラーを返してからスクリプトが実行を停止します。スクリプトを続行します。 – JorgeO

+0

@Alex:デフォルトですが、デフォルトの設定を上書きするものがあります。 –

答えて

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のinitスクリプトを見ています、あなたはそれを不必要に嫌うことはありません。

this postを参照すると、解除/設定+ eが表示されます。あなたの直面する問題を解決することはできますが、特にあなたがファイルをコピーしているので、自分のスクリプトで最近設定されていない動作が必要になることがあります。

これは、Makefileがさまざまなビルド環境で期待どおりに動作すること以外は、真と偽が行われた最大の理由の1つです。

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

+0

コードとルートユーザーのパスを削除しました。誰かがsuとする必要があると思われる可能性があるからです。あなたが気にしないといいですか?) –

+0

@victor hugo - ありがとう。私はこの記事を数回編集して、私がタクトで道を去ったことに気付かなかった:私は今日、わずかに脳死でなければならない。 –

+0

私は実際にその部分を理解していない2>&1 ||本当。私は理解する>/dev/nullは、エラーがそこにリダイレクトされることを意味しますが、私は構文や他の部分の意味を理解していません。多分説明することができますか? – Toskan

-3

標準エラーを2> myerrorのようなファイルにリダイレクトしてみてください。

+0

コマンド>/dev/nullのように見える場合。そのようなものですか?これにより、コマンドの出力がファイルに移動します。しかし、また、エラーをキャッチですか? – JorgeO

+0

これはエラーから回復せず、単に原因を隠すだけです。 –

4

bash's set commandを使用すると、非終了時の終了動作を一時的に無効にすることができます。

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

あなたのスクリプトの説明を少し書くべきです。 「編集」をクリックするだけです。 BTWへようこそSO –

+0

{args}は常にポータブルではありません。ただし、次の場合: set + e || { 脳死したシェルに対処するコード } POSIX準拠の塩の価値があるものはどれもいいです。 普遍的に、そのほうがはるかに簡単です(そして移植性も高い)。 –

28

あなたのコマンドを実行し、set +eで「終了直後に」オプションを無効にし、その後、必要に応じてset -eでそれを再度有効:

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

set組み込みの説明については、Bashのマニュアルのsection 4.3.1を参照してください。さまざまな選択肢(その中には多くのものがあります)があります。

1

invoke-rc.d tomcat stopが、失敗することを防ぐための唯一のものです。invoke-rc.d tomcat stop || trueそれを行うかもしれませんか?これは決してゼロ以外の終了ステータスを持つべきではありません。

関連する問題