web-dev-qa-db-ja.com

シェルコマンドの "&&"の目的は何ですか?

私の知る限りでは、コマンドの後に&を使用するのはバックグラウンドで実行するためです。

&の使用例:tar -czf file.tar.gz dirname &

しかし、&&はどうですか。 (この例を見てください: https://serverfault.com/questions/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer -215188

312
Captain

&&前のコマンドが正常に完了したかどうかに基づいて何かをすることができます - それがdo_something && do_something_else_that_depended_on_somethingとして連鎖されるのを見る傾向がある理由です。

356
girasquid

さらに、論理的なorである||、および以前のコマンドに何が起こってもかまわない単なる区切り文字である;もあります。

$ false || echo "Oops, fail"
Oops, fail

$ true || echo "Will not be printed"
$  

$ true && echo "Things went well"
Things went well

$ false && echo "Will not be printed"
$

$ false ; echo "This will always run"
This will always run

これに関するいくつかの詳細はここで見つけることができます Bashマニュアルのコマンドのリスト

335
plundra

コマンドライン - &&の目的は何ですか?

シェルでは、あなたが見るとき

$ command one && command two

その意図は、最初のコマンドが成功した場合にのみ、&&に続くコマンドを実行することです。これはPosixシェルの慣用句で、Bashだけではありません。

最初のプロセスが失敗した場合、2番目のプロセスが実行されないようにします。

プロセスはtrueの場合は0、falseの場合はその他の正数を返します。

プログラムは終了時に シグナル を返します。正常に終了した場合は0を返し、正常に終了しなかった場合は0より大きい値を返します。これにより、プロセス間の通信量が制限されます。

&&posixシェル文法 ではAND_IFと呼ばれ、 and_orリストの一部です コマンドも含まれます。これには、同じ意味を持つ||であるOR_IFも含まれます。

文法記号:

%token  AND_IF    OR_IF    DSEMI
/*      '&&'      '||'     ';;'    */

文法:

and_or           :                         pipeline
                 | and_or AND_IF linebreak pipeline
                 | and_or OR_IF  linebreak pipeline

どちらの演算子も同じ優先順位を持ち、左から右に評価されます(これらは左結合です)。次に例を示します。

$ false && echo foo || echo bar
$ true || echo foo && echo bar

どちらもbarだけをエコーし​​ます。

  1. 前者の場合、falseは1のステータスで終了するコマンドです。

    $ false
    $ echo $?
    1
    

    つまり、echo fooは実行されません(つまり、echo fooの短絡)。その後、コマンドecho barが実行されます。

  2. 後者の場合、trueは0のコードで終了します。

    $ true
    $ echo $?
    0
    

    したがってecho fooは実行されず、echo barが実行されます。

90
Aaron Hall

'&&'のごく一般的な使い方は、autotoolsを使ってソフトウェアをコンパイルすることです。例えば:

./configure --prefix=/usr && make && Sudo make install

基本的にconfigureが成功するとmakeがコンパイルのために実行され、それが成功するとmakeがrootとして実行されプログラムをインストールします。私は、物事がうまくいくことをほとんど確信しているときにこれを使います、そしてそれは私が進歩を「モニターする」のではなくstackoverflowを見ることのような他の重要なことをすることを可能にします。

時々私は本当にうんざりする...

tar xf package.tar.gz && ( cd package; ./configure && make && Sudo make install ) && rm package -rf

私はこれを例えば最初からLinuxを作るときに行います。

30
Nigel Atkinson

&&はコマンドをまとめます。後続のコマンドは、先行するコマンドが成功した場合にのみ実行されます。

同様に、||は、先行するコマンドが失敗した場合に連続したコマンドの実行を許可します。

Bashシェルプログラミング を参照してください。

17
Dean Burge

例を見てください。

mkdir test && echo "Something" > test/file

シェルはディレクトリtestを作成しようとし、そしてそれが成功した場合のみlはその中にファイルを作成しようとします。

そのため、手順の1つが失敗した場合は、一連の手順を中断することができます。

8
alno

command_1 && command_2:command_1が正常に実行された場合にのみcommand_2を実行します。

command_1 || command_2:command_1が正常に実行されなかった場合にのみcommand_2を実行します。

メインストリームのプログラミング言語で 'if'条件が実行されるのと同じように感じます。例えば、if (condition_1 && condition_2){...}のcondition_2はfalsename__の場合は省略され、if (condition_1 || condition_2){...}の場合はcondition_1がtruename__の場合は省略されます。参照してください、それはあなたがコーディングに使うのと同じトリックです:)

6
Xiaonin Li

最初のステートメントが正常に終了したら、2番目のステートメントを実行します。 if文のように:

 if (1 == 1 && 2 == 2)
  echo "test;"

最初は1 == 1であれば試し、それが真ならば2 == 2であるかどうかを調べる

5
Nick