シェルでコマンドの実行が失敗したかどうかを検出するには?

シェルでコマンドの実行が失敗したかどうかを検出するには?

私はJavaを使用してリモートコンピュータからシェルスクリプトを呼び出しています。

シェルの実行が失敗したかどうかを知りたいです。しかし、$?スクリプトが完了した後に戻りコードを確認するのがうまくいかないことがわかりました。$?スクリプトの最後のコマンドの結果コードのみが表示されます。

したがって、1つの命令が実行されなくても、最後の命令は正常に実行される。見つかりません。問題を解決する方法を知りたいです。

シェルですべてのコマンドの結果コードを確認する必要がありますか?コマンドが実行されない場合は、スクリプトを終了しますか?

答え1

set -eスクリプト内で使用したり、-e起動時にインタプリタに渡したりできます。

#!/bin/sh
set -e

または

/bin/sh -e /path/to/script.sh

 

http://pubs.opengroup.org/onlinepubs/007904975/utilities/set.html:

- 金利

このオプションを有効にすると、シェルエラーの結果に記載されている理由で単純コマンドが失敗するか、終了ステータス値> 0を返し、while、Until、またはifキーワードの後に​​ある複合リストの一部でない場合は、ANDにリンクされず、ORリストの一部でもなく!が先に来るパイプでもありません。予約語を使用すると、シェルはすぐに終了する必要があります。

答え2

トラップを使用することもできます。

trap 'command' signal

シェルスクリプトは次のとおりです。

trap 'trapHandler $LINENO' ERR

ERR信号をキャプチャします。trapHandler()これが可能です。

trapHandler()
{
    retCode=$?
    echo "[LINE:$1] Error:exited with status $retCode"
    exit $retCode
}

関連情報