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など)がゼロ以外の終了コードで終了すると、スクリプトがすぐに終了します。