基本的に、各コマンドの後にエラーコードをチェックするオプションがあります。特に失敗するコマンドの場合。これは、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プログラムブロックの(予期しない)終了時の一時的なリソースが含まれます。
[最小限で完全で検証可能な例を作成する方法](http://stackoverflow.com/help/mcve)をご覧ください。 – Cyrus
まず、Bashにはエラーを「スローする」という概念がないため、何が起こっているのかを誤解している必要があります。あなたの問題を解決するには、これらのコマンドが実際に何をしているのか把握しなければなりません。第二に、* 7800行* ??それは本当に悪い兆候です。このスクリプトはおそらく狂気であり、おそらく重要な再作業が必要です。 – ruakh
エラーによって異なります。続行することが危険な場合は、多くのエラーがあります。私はコードの7800行のスクリプトを持つことは貧弱な設計であり、少なくとも分離してテストできる機能に分解されるべきであることを示唆しています。おそらく、別のスクリプトに分割するか、間違った言語を使用している可能性があります。 – cdarke