2017-07-31 19 views
1

私のアプリケーションをインストールするためのシェルスクリプトを書いています。コピー、解凍、移動、ifなどのスクリプトには、より多くのコマンドがあります。いずれかのコマンドが失敗した場合は、エラーを知りたい。また、私はゼロ以外の終了コードを送信したくありません。シェルスクリプトのエラー処理方法

スクリプトのインストール(root-file.sh)の順序: -

./script-to-install-mongodb 
./script-to-install-jdk8 
./script-to-install-myapplicaiton 

サンプルスクリプトファイル: -

cp sourceDir destinationDir 

unzip filename 

if [ true] 
// success code 
if 

私は私のいずれかの場合には、変数または任意のメッセージを使って、知りたいですscriptsコマンドはroot-file.shで失敗しました。

すべてのコマンドのステータスを確認するためのコードを書いたくありません。場合によっては、無効なディレクトリのためにcpまたはmvコマンドが失敗することがあります。スクリプトの実行が終了したら、すべてのコマンドが正常に実行されたか、それともエラーが発生したのかを知りたいですか?

これを行う方法はありますか?

注:私はシェルスクリプトではないbashの

+0

'$?'最後に実行されたコマンドのステータスを与える、私はあなたが使用することができると思う... example - test -x [$? -ne 0] then echo "ファイルは終了しません" exit 0 fi – deepakl

+0

@karan - 私の解決策があなたの問題を解決したら、答えを受け入れて投票してください! – JRG

答えて

1

/*に特殊変数$のあなたの最後のコマンドの店舗の状況を使用しています?あなたは$のための変数を定義することができますか? export var = $を実行していますか?

command || fallback_command 

を次のようにLinuxのシェルスクリプトで処理する*/

unzip filename 
export unzipStatus=$? 
./script1.sh 
export script1Status=$? 
if [ !["$unzipStatus" || "$script1Status"]] 
    then     
     echo "Everything successful!"  
    else 
     echo "unsuccessful" 
fi 
+0

更新された質問を教えてください。 – karan

+0

@karan、私は私の答えを更新しました。論理的には、いずれかのステータスが成功しない場合、最終的な操作は成功しません。 –

+0

@ karan、論理は単純ですが、すべての論理和を否定する必要があります。 –

1

例外を使用すると、複数のコマンドを持っているなら、あなたはここで

(command_one && command_two) || fallback_command 

fallback_commandを行うことができます行うことができますechoたりすることができlogファイル内の詳細など

set -xをスクリプトの上に置いて詳細な実行を確認しようとしたのかどうかは分かりません。

+0

私の更新された質問を親切に参照してください。 – karan

+0

私の解決方法では、各コマンドのステータスを確認する必要はありませんが、フォールバックコマンドを使用することが容易になりますので、後で見るためにログファイルに失敗または成功の詳細を記録することができます。 – JRG

1

これを達成するためにシェルスクリプトを使用しているように、外部ツールがあまりありません。デフォルトの$?助けが必要です。スクリプトの間で検索値を確認することができます。コードは次のようになります。

./script_1 
retval=$? 
if $retval==0; then 
    echo "script_1 successfully executed ..." 
    continue 
else; 
    echo "script_1 failed with error exit code !" 
    break 
fi 
./script_2 

これはシナリオに任意の値を追加した場合に表示されます。

1

ここに2セントを入れたいですか?このようなあなたのシェルを実行しますERRORS.TXTから

sh root-file.sh 2> errors.txt 

grepのパターンは、上記のgrepコマンドの

grep -e "root-file.sh: line" -e "script-to-install-mongodb.sh: line" -e "script-to-install-jdk8.sh: line" -e "script-to-install-myapplicaiton.sh: line" errors.txt 

出力はラインなしと一緒に中にエラーが発生していたコマンドが表示されます。出力があるとしましょう: -

test.sh:ライン:ファイル3:アクセス許可があなただけに行くとノーラインチェックすることができます

を拒否された(ここでは8である)問題がありました。これはgo to line no. in viを参照してください。

またはこれも自動化することができます。シェルスクリプトのgrep固有の行。 grep行に問題があったのはです。

head -8 test1.sh |tail -1

ことができます願っています。

関連する問題