コンソールでコマンドをチェーンするにはどうすればよいですか?


23

ではbash、いくつかのコマンドをシリアルで実行したいことがありますが、新しいコマンドを入力する前にコマンドが終了するのを待ちたくありません。だから私はこのようなことをします:

cmd1; cmd2; cmd3

残念ながら、コマンドの1つが失敗する可能性があります。その場合、私は停止したいと思います。これを行う簡単な方法はありますが、前のコマンドの終了コードが0の場合にのみコマンドを実行し続けるようにしますか?


ここで素晴らしい答え UnixのSEからは。
NonlinearFruit

回答:


39

&&演算子を使用、

cmd1 && cmd2 && cmd3

shellscripting、中&&および||演算子はC.の論理演算子の最適化実施後にモデル化されている&&意味し、演算子、および||手段または。UnixはCと密接に関連しており、Cでは、論理演算子の第2オペランドは、結果が第1オペランドからすでにわかっている場合は評価されません。例えば、"false && x"あるfalse任意のためx、そう評価する必要はありませんx(特に場合はx、関数呼び出しです)。同様に"true || x"。これは、短絡セマンティクスとも呼ばれます。

Unixでは、コマンドの戻り値を「成功完了」の真理値として解釈するのが伝統的です。終了コード0はtrue(成功)、非ゼロはfalse(失敗)を意味します。したがって、最初のコマンドがcmd1 && cmd2返されると"false"(失敗を示すゼロ以外の終了ステータス)、複合コマンドのステータスは既知です:失敗。したがって、の全体的な解釈は次のcmd1 && cmd2 ようになります。「実行しcmd1、失敗しなかった場合は、cmd2」これは基本的にあなたの質問に欲しいものです。

同様にOR:cmd1 || cmd2は、「実行cmd1、または失敗した場合」と解釈できますcmd2


ヒント:の長いチェーンについては&&set -eスクリプトの挿入を検討してください。基本的に、セミコロン;&&に変更し、いくつかの特殊なケースを使用します。


1
説明のために+1||
アルプ

最初のコマンドのステータスが何であっても連鎖できますか?(成功または失敗)
ヒューゴトレンソー

@HugoTrentesauxどういう意味ですか?..成功/失敗の結果、またはA || B[短絡]論理AまたはBとまったく同じです。A || Bある成功ときAだった成功は、またはときAだった失敗が、Bだっ成功。そして、A || Bある失敗ときAだった失敗Bしましたfailure。同様に&&、論理ANDに従います。
ulidtko

シェルコンテキストでは、Aが失敗または成功した場合でも、Aを実行してからBを実行するにはどうすればよいですか?
ヒューゴトレンソー

1
@HugoTrentesauxは、プレーンレギュラー;(または改行)がデフォルトで行うことです。set -eなります;&&大まかに言えば、。set +e[デフォルト]はA; Bあなたが言うことになる:run A、そしてno-matter-what run B
ウリトコ

13

「連鎖コマンドとそれらのグループ化」

ping 192.168.0.1 || { echo "ping not successful"; exit 1; }

pingは、成功しなかった場合にのみ、括弧で囲まれた一連のコマンドを実行します。

注意:

リストは「;」で終了する必要があります。

括弧とグループ化されたコマンドの間には空白が必要です!


6

&&オペレーターと一緒に。例えば:

cmd1 && cmd2 && cmd3

コマンドの1つが失敗した(0以外の終了値を返す)場合、他のコマンドは実行されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.