私は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
}