bash - 終了しない - シェルスクリプト 終了




エラー時にbashシェルスクリプトから自動的に終了する (5)

私はいくつかのシェルスクリプトを書いてきましたが、コマンドのいずれかが失敗した場合に上記のシェルスクリプトの実行を停止する機能があると便利です。 以下の例を参照してください。

#!/bin/bash  

cd some_dir  

./configure --some-flags  

make  

make install

この場合、スクリプトが指定されたディレクトリに変更できない場合は、失敗した場合に後で./configureを実行することは望ましくありません。

今私はよく考えていますが、コマンドごとにifチェックを行うことができます(これは絶望的な解決策です)が、コマンドの1つが失敗した場合にスクリプトを終了させるためのグローバル設定がありますか?


1つのイディオムは次のとおりです。

cd some_dir && ./configure --some-flags && make && make install

私はそれが長くなることが分かっていますが、大きなスクリプトの場合は論理的な機能に分解することができます。


set -e組み込み関数を使用します。

#!/bin/bash
set -e
# Any subsequent(*) commands which fail will cause the shell script to exit immediately

あるいは、コマンドラインで-eを渡すこともできます:

bash -e my_script.sh

この動作はset +eで無効にすることもできます。

(*) 注意:

失敗したコマンドが、 whileまたはuntilキーワードの直後にあるコマンドリストの一部である場合、シェルは終了しませ 。ifまたはelifの予約語に続いて、 &&または||で実行されるコマンドの一部です。 最後の&&または||の後のコマンドを除くリスト 、パイプライン内の任意のコマンドが最後のコマンド、またはコマンドの戻り値が反転されている場合は

man bashから)


ここでそれを行う方法です:

#!/bin/sh

abort()
{
    echo >&2 '
***************
*** ABORTED ***
***************
'
    echo "An error occurred. Exiting..." >&2
    exit 1
}

trap 'abort' 0

set -e

# Add your script below....
# If an error occurs, the abort() function will be called.
#----------------------------------------------------------
# ===> Your script goes here
# Done!
trap : 0

echo >&2 '
************
*** DONE *** 
************
'

コマンドの1つが失敗するとすぐにスクリプトを終了するには、最初にこれを追加します。

set -e

これにより、あるテストの一部ではないいくつかのコマンド( if [ ... ]条件や&& constructなど)がゼロ以外の終了コードで終了すると、スクリプトがすぐに終了します。


私はあなたが探しているのはtrapコマンドだと思う:

trap command signal [signal ...]

詳細は、 このページを参照してください

別のオプションは、スクリプトの先頭にset -eコマンドを使用することです。プログラム/コマンドが真でない値を返すと、スクリプトは終了します。







exit