どちらが良いですか:using; または&&を1行で複数のコマンドを実行するには?


427

チュートリアルとハウツーでは、よくコマンドが組み合わされています。例えば、

sudo apt-get update && sudo apt-get install pyrenamer

:そこ四つの可能なコネクタであるように見える&&&||;。けれども& コネクタが私には明らかである(それがバックグラウンドにプロセスを送信し、利用できる端末は葉)、違いが間にあるものをクリアしていない&&;。そして、私は||カヤのコメントまで知りませんでした。

次の質問では、2つのコネクタの違いを扱いますが、ほとんどはコメントで行います。

したがって、関連する質問がいくつかあります。

  1. 違いは何である;とは&&
  2. それぞれいつ使用する必要がありますか?いくつかのユースケースを見るといいでしょう:コマンドを実行し、それからコンピューターをシャットダウンしたい場合、どのコネクターを選択すればよいですか?
  3. 彼らの利点危険は何ですか?Robie Basakはへのコメントに言及し、この答えのようなコマンドはcd /somewhere_else; rm -Rf *、コマンド・チェーンの最初の要素は、例えば、失敗した場合に破壊的な影響を持つことができます。
  4. 関連する場合、どこから来たのですか?

7
遭遇していないかもしれない別のコネクタがあります:最初のコマンドがゼロ以外の(失敗)ステータスで終了した場合にのみ2番目のコマンドを実行すること||&&除いて、同じです。
カヤ

4
また、スクリプトを実行するset -eと、すべてのコマンドがに接続されているかのように、失敗時にスクリプトが停止することに注意してください&&
チョロバ


3
誰もQn 4に答えませんでした... &&および||の動作が疑われる Cプログラミング言語に触発されました。(x && y)の場合、xがfalseと評価される場合、式全体がfalseでなければならないため、コンパイラはyの評価を最適化できます。最新のCおよびC ++標準では実際にこの最適化が必要であるため、プログラムはxがfalseの場合にyが評価されないと想定できます。たとえば、ptrがnullであっても(ptr && ptr-> days> 31)はクラッシュしません。また、Cでは、ステートメントは;で終わります。同じ行に別のステートメントがあるかどうかに関係なく。
ケビン

回答:


771

カンニングペーパー:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.

19
そしてもちろん、A & B &:Aをバックグラウンドで実行し、次にBをバックグラウンドで実行し(成功に関係なく)、シェルに制御を戻します。多くの場合、これは両方のプロセスを同時に実行するのとほぼ同じように機能します。
限定A罪

4
次のように言うことはできますか?(私は推測&&&?)
user230910

15
@ user230910:それは(A && B) &
leftaroundabout

5
このための信頼できるドキュメントを参照できますか?
ハイメHablutzel

@Jack Cronjobから実行された場合、このルールに完全には従いません。理由は何ですか?Pythonファイルの場合
-CodeGuru

77

&&最初のコマンドがステータス0(成功)で終了した場合にのみ、2番目のコマンドを実行します。;最初のコマンドがゼロ以外のステータスで終了した場合でも、両方のコマンドを実行します。

の例は、次の&&ように言い換えることができます。

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi

ありがとう。質問を更新して、さまざまなサブ質問を簡単に区別できるようにしました。
don.joey

5
@Private:;2番目のコマンドが成功する前のコマンドを必要としない場合に使用する必要があります。
チョロバ

31

を使用;すると、最初のコマンドが成功したかどうかに関係なく、コマンドが実行されます。

使用して&&最初のコマンドが正常に実行さだけ第2コマンド(状態0)を実行します。

両方とも異なる視点で使用されます。より長いプロセスの場合と同様に、インストールの場合はコンパイルしてインストールする必要があると言います。する必要がありmake && make installます。そのため、インストールはmake成功した場合にのみ実行されます。

そのため、依存コマンドの場合は、使用する必要があります &&

wring bash、または独立したコマンドを使用するコマンド ;

したがって、最初のジョブが使用;に失敗した場合でもコンピューターをシャットダウンしたい場合、最初のジョブが完全に成功したい場合はシャットダウンの使用を開始します&&


14

a ; baの終了ステータスに関係なくbを実行します。a && baが成功した場合にのみbを実行します。

これは、最初の3つの質問に答えるのに必要かつ十分です。特に、2は広すぎて、「1つの」決定的な答えを与えることができません-あなたの最善の策は、ケースバイケースで決定することです。

4番目の質問については、Bash構文です。

どちらを使用しても本質的な危険はありません。繰り返しますが、上記の定義で十分です。それは、成功しない場合、意図しない効果がある&&ときに書くことを意味します。これ以上のルールや説明は必要ありません、私見。ba


1

A; B#Aの成功に関係なく、Aを実行してからBを実行する

A && B#Aが成功した場合にのみBを実行

A || B#Aが失敗した場合にのみBを実行する

A&#バックグラウンドでAを実行します。

非常に良い経験則。場合によっては、これらのコマンドをサブシェルで使用することは、それらを単一のユニットと見なしたい場合や、操作の結果を現在のシェルと結合したくない場合に意味があります。

例:

-2つのコマンドの出力を連結します。

(ls foo; ls bar) > single-result.txt

-ディレクトリに移動して、シェルの現在のディレクトリを変更せずにそこからコマンドを実行します。

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