私はシェルスクリプトの初心者です。メッセージが出力され、コマンドが失敗した場合はスクリプトを終了したい。私はもう試した:
my_command && (echo 'my_command failed; exit)
しかし、それは機能しません。スクリプトのこの行に続く命令を実行し続けます。私はUbuntuとbashを使用しています。
私はシェルスクリプトの初心者です。メッセージが出力され、コマンドが失敗した場合はスクリプトを終了したい。私はもう試した:
my_command && (echo 'my_command failed; exit)
しかし、それは機能しません。スクリプトのこの行に続く命令を実行し続けます。私はUbuntuとbashを使用しています。
回答:
試してください:
my_command || { echo 'my_command failed' ; exit 1; }
4つの変更:
&&
へ||
{ }
代わりに使用( )
;
後に紹介しexit
、{
前後のスペース}
メッセージを出力して、コマンドが失敗した場合にのみ終了する(ゼロ以外の値で終了する)必要がある||
ので、は必要ありません&&
。
cmd1 && cmd2
成功したcmd2
ときに実行されますcmd1
(終了値0
)。どこに
cmd1 || cmd2
失敗したcmd2
ときに実行されcmd1
ます(終了値がゼロ以外)。
使用すると、( )
その中のコマンドを実行になり、サブシェルと呼び出すexit
ので、実行は元のシェルで続けて、あなたはサブシェルではなく、あなたのオリジナルのシェルを終了するには、そこに原因から。
この使用を克服するには { }
最後の2つの変更はbashで必要です。
{ (>&2 echo 'my_command failed') ; exit 1; }
他の回答は直接的な質問をうまくカバーしていますが、の使用にも興味があるかもしれませんset -e
。これにより、失敗したコマンド(if
テストなどの特定のコンテキスト以外)はスクリプトを中止します。特定のスクリプトでは、非常に便利です。
set -e
です。いつ機能するか、いつ機能しないかについて、長くて難解な一連のルールがあります。(誰が実行した場合if yourfunction; then ...
、その後、set -e
火災の内部決してyourfunction
そのコードが考慮され、またはそれが呼び出す何でもので「チェックします」)。BashFAQ#105の演習セクションを参照して、これとその他の落とし穴について説明してください(一部は特定のシェルバージョンにのみ適用されるため、スクリプトの実行に使用される可能性があるすべてのリリースに対してテストする必要があります)。
また、各コマンドの終了ステータスはシェル変数$?に格納されます。これは、コマンドを実行した直後に確認できます。ゼロ以外のステータスは失敗を示します。
my_command
if [ $? -eq 0 ]
then
echo "it worked"
else
echo "it failed"
fi
echo "Just finished step A"
、後でチェックされる予定のがecho
上書きされた$?
ことを知りません。
スクリプト内のすべてのコマンドに対してその動作が必要な場合は、次を追加します
set -e
set -o pipefail
スクリプトの最初。このオプションのペアは、コマンドがゼロ以外の終了コードで戻るたびに終了するようにbashインタープリターに指示します。
ただし、これでは終了メッセージを出力できません。
trap
bash組み込みコマンドを使用して、終了時にコマンドを実行できます。
set -o pipefail
望ましい動作ではない可能性があるためです。それを指摘してくれてありがとう!
set -e
信頼性、一貫性、予測性がまったくない!それを納得させるには、BashFAQ#105の演習セクション、またはin-ulm.de/~mascheck/various/set-eのさまざまなシェルの動作を比較する表を確認
私は次のイディオムを作り上げました:
echo "Generating from IDL..."
idlj -fclient -td java/src echo.idl
if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi
echo "Compiling classes..."
javac *java
if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi
echo "Done."
各コマンドの前に有益なエコーを付け、各コマンドの後に同じ
if [ $? -ne 0 ];...
行を続けます。(もちろん、必要に応じてそのエラーメッセージを編集できます。)
if ! javac *.java; then ...
-なぜ$?
まったく気にしないのですか?
提供されたものmy_command
が標準的に設計されている場合、つまり成功した場合に0を返し、その後&&
は希望とは正反対です。あなたが欲しい||
。
また(
、それはbashでは私には適切ではないように見えますが、私はどこにいるかは試すことができません。教えてください。
my_command || {
echo 'my_command failed' ;
exit 1;
}
終了エラーステータスを保持し、1行に1つのコマンドを含む読み取り可能なファイルを使用する場合も使用できます。
my_command1 || exit $?
my_command2 || exit $?
ただし、これは追加のエラーメッセージを出力しません。ただし、場合によっては、失敗したコマンドによってエラーが出力されることがあります。
exit $?
。デフォルト値としてexit
使用するだけ$?
です。