2016-08-13 12 views
-2

私は複数の行のコードをbashで使用していますが、スクリプトの実行中にエラーメッセージが表示されることがありますので、エラーの処理方法を教えてください。私はちょうどエラーをキャッチし、特定のエラーメッセージを表示したい、そして私は実行中のスクリプトを止めたくない。それは7800行のコードを持っているから次のステップを続行したい。各テストステップはifループ内にあります。一連のコード行を持つifループ内のエラーをどのように処理するかを知りたい。bashのブロックエラー処理の場合

ありがとうございました。

+1

[最小限で完全で検証可能な例を作成する方法](http://stackoverflow.com/help/mcve)をご覧ください。 – Cyrus

+1

まず、Bashにはエラーを「スローする」という概念がないため、何が起こっているのかを誤解している必要があります。あなたの問題を解決するには、これらのコマンドが実際に何をしているのか把握しなければなりません。第二に、* 7800行* ??それは本当に悪い兆候です。このスクリプトはおそらく狂気であり、おそらく重要な再作業が必要です。 – ruakh

+2

エラーによって異なります。続行することが危険な場合は、多くのエラーがあります。私はコードの7800行のスクリプトを持つことは貧弱な設計であり、少なくとも分離してテストできる機能に分解されるべきであることを示唆しています。おそらく、別のスクリプトに分割するか、間違った言語を使用している可能性があります。 – cdarke

答えて

1

基本的に、各コマンドの後にエラーコードをチェックするオプションがあります。特に失敗するコマンドの場合。これは、Cライブラリ関数のリターンコードをチェックするのとまったく同じです。それはエラー処理でコードを荒らすので、再利用可能な関数で行うのが良いです。

エラーコード変数$?をチェックすることでこれを行うことができますが、より一般的には、シェルが0終了コードをブール値trueとして評価するという事実を使用します。したがって、単一のコマンドの場合、それは最初は偽(エラー別名別名非ゼロの終了コード)が戻された場合にのみ第二項(シェル機能)を評価||(又は)リスト演算子を用いて行うことができる

function die { echo "$1" 1>&2 ; exit 1; } 

mkdir ./bla || die "Cannot create directory ./bla errno=$?" 

エラーが発生した後、通常はbash(シェル)が処理されます。この場合、例えば、tempディレクトリが存在しない場合、スクリプトは現在のディレクトリのdetroy内容は以下となります。

cd /home/user/temp 
rm -rf * 

だから、「-e設定」に設定すると、この動作をオフにするのは良いことです。

set -e 
cd /home/user/temp 
rm -rf * 

または(代わりに改行や;&&とリスト演算子を使用して)依存関係について具体的に:

# execute rm only if cd was sucessful 
cd /home/user/temp && rm -rf * 

だから、上の「出口をオンにするために一般的に良いアイデア(caveat)でありますエラー "モードになります。この場合、 は、あなたが失敗することが許されるしたいコマンドを、同じように守らする必要があります

set -e 
cd /home/user/temp 
rm -rf * || true # ignore failures 

とコードのブロックのために取り扱い、最後に、より複雑なエラーが仕上げトラップハンドラで行われます。プログラムが終了すると実行され、エラーを出力するために使用することができます。これは、他のプログラミング言語でのtry/catchと比較して、それは、より特定の定義された条件での低レベルのバックグラウンドの解釈であることができます:巻き戻し/ ceaning変更(シグナル処理の横)

function errorhandler 
    { echo "Unexpected error while cleaning dir: $1 - $2"; exit 1 } 

# try-start - capture errors 
trap "errorhandler $LINENO $BASH_COMMAND" ERR 

cd /home/user/temp 
rm * || true # dont trigger error handler here 

# try-end - stop capturing errors 
trap - ERR 

トラップ(trap "cleanup_function" EXIT)もあるtypically usedプログラムブロックの(予期しない)終了時の一時的なリソースが含まれます。

+1

+1。しかし、 'set -e'は非常にエラーを起こしやすく、推奨するべきかどうかは議論の余地があります。 (http://mywiki.wooledge.org/BashFAQ/105を参照してください) – ruakh

+0

ありがとうございます@ruakh私は警告としてリンクを追加しました(個人的には、特にエラー処理のないクイックスクリプトのためのデフォルト設定と思います)。 – eckes

関連する問題