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


回答:


399

&&前のコマンドが正常に完了したかどうかに基づいて何かを実行できますdo_something && do_something_else_that_depended_on_something。そのため、としてチェーンされているのがわかります。


391

さらに、||どちらが論理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マニュアルの「コマンドのリスト」を参照してください。


5
多分あなたは追加したいと思いますfalse && echo "Will not be printed"
MTSan、

112

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

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

$ command one && command two

その目的は&&、最初のコマンドが成功した場合にのみ、次のコマンドを実行することです。これはPosixシェルの慣用句であり、Bashでのみ見られるものではありません。

最初のプロセスが失敗した場合、2番目のプロセスの実行を防ぐことを目的としています。

私が「意図」という言葉を使用したことに気付くかもしれません-それは正当な理由によるものです。すべてのプログラムが同じ動作をするわけではないので、これが機能するためには、プログラムおよび「必要に応じてソースコード」を読むことによって、プログラムが「障害」と見なすものとそれがどのように処理されるかを理解する必要があります。

シェルは、trueの場合は0の戻り値を、falseの場合はその他の正の数を考慮します

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

&&呼ばれるAND_IFPOSIXシェル文法の一部であり、and_orリストにも含まれるコマンドの、||あるOR_IF同様のセマンティクスを。

ドキュメントから引用された文法記号:

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

任意の数のことを示している(また、ドキュメントから引用)文法、AND_IFS( &&)および/またはOR_IFsが(||(AS)つなぎ合わせすることができるand_or再帰的に定義されています)。

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

両方の演算子の優先順位は等しく、左から右に評価されます(これらは左結合です)。ドキュメントが言うように:

AND-ORリストには、オペレータによって区切られた1つのまたは複数のパイプラインのシーケンスである"&&""||"

リストには、オペレータによって区切られた1つまたは複数のAND-ORリストのシーケンスである';''&'し、必要に応じてで終了し';''&'または。

演算子"&&""||"は優先順位が等しく、左結合性で評価されます。たとえば、次のコマンドはどちらも標準出力にbarのみを書き込みます。

$ false && echo foo || echo bar
$ true || echo foo && echo bar
  1. 最初のケースでは、falseは次のステータスで終了するコマンドです 1

    $ false
    $ echo $?
    1

    その手段echo fooに実行されない(すなわち、短絡echo foo)。次に、コマンドecho barが実行されます。

  2. 2番目のケースでは、trueは次のコードで終了します。 0

    $ true
    $ echo $?
    0

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


31

「&&」のごく一般的な使用法は、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を最初から作成するときに行います。


2
REPLには優れていますが、スクリプトのset -o errexit場合はBashを使用します。
フランクリンユー

19

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

同様に、||前のコマンドが失敗した場合に、後続のコマンドを実行できます。

Bash Shell Programmingを参照してください。


8

例を参照してください。

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

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

したがって、ステップの1つが失敗した場合、一連のステップを中断することができます。


8

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

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

最初は1 == 1の場合に試行し、それがtrueの場合は2 == 2かどうかを確認します


1
誰かが質問につまずいたユーザーのためにこれがなぜ反対票を投じられたのか誰かが説明できますか?
user3243242 2017

1
@ user3243242間違いではありません。使用例を示すには不十分な例です&&
dan

ifテストがbashでどのように機能するかについての素晴らしい洞察です。私はそれを比較コマンドのチェーンのように考えたことはなく、それらのいずれかが失敗したときに壊れていました。だからあなたは私の
賛成投票

1
その結果は、あなたが使用して反対の行動を得ることができるということです||それらのいずれかが成功するまでチェーンコマンドに、: eei || leu || uie || echo prout3 || echo "never executed"
PiRK

7

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

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

で、「もし」条件が同様、主流のプログラミング言語で実行される方法と同様に感じているif (condition_1 && condition_2){...}condition_2 condition_1がある場合は省略されるfalseとしてif (condition_1 || condition_2){...}condition_1がある場合は省略されますcondition_2 true。見てください、それはあなたがコーディングに使用するのと同じトリックです:)


「まったく逆」の意味はわかりませんが、$ echo '1' || echo '2'は '1'のみを出力します。と$ wrong_command || echo '2'はエラーメッセージを出力し、 '2'は次の行に出力します。あなたはそれについて何が間違っていると思いますかについてもう少し説明してもらえますか?
Xiaonin Li 2017

昨日は確かに疲れていた。申し訳ありませんが、それは私だけでした:/私が賛成したい場合は、回答の中で何かを編集する必要があります(回答を0にするために、現在、stackoverflowが編集を要求しないようにしてください)
Arount

@Arount、心配しないで大丈夫です。だから私は編集を提出しました。今、反対票を削除できますか?
Xiaonin Li 2017

ええ、本当に、すみません、本当に
Arount

0
####################### && or (Logical AND) ######################
first_command="1"
two_command="2"

if [[ ($first_command == 1) && ($two_command == 2)]];then
 echo "Equal"
fi

プログラムがコマンドかどうかをチェックすると、プログラムは終了コードと呼ばれる数を作成します。両方の条件が真の場合、終了コードはゼロ(0)です。それ以外の場合、終了コードは正の数です。終了コードがゼロ(0)で生成され、両方の条件が真である場合にEqualを表示する場合のみ。


Stackoverflowへようこそ。ここに投稿する前に、コードスニペットが機能することを確認してください。あなたはそれを修正する必要がありますif [[ ($first_command == "1") && ($two_command == "2") ]];then echo "Equal"; fi

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