2つのアンパサンドとセミコロンがbashで動作する方法に違いはありますか?


71

1行で2つの別個のコマンドを実行したい場合、これを行うことができます。

cd /home; ls -al

またはこれ:

cd /home && ls -al

そして、私は同じ結果を得ます。しかし、これら2つの方法でバックグラウンドで何が起こっているのでしょうか?それらの機能的な違いは何ですか?

回答:


88

は、;1つのコマンドを別のコマンドから分離するだけです。ザ・は&&前回が成功した場合のみ、次のコマンドを実行しますと言います

cd /home; ls -al

これはcd /homecdコマンドが失敗した場合(/home存在しない、それをトラバースする権限がないなど)でも実行されますls -al

cd /home && ls -al

これはls -alcd /home成功した場合にのみ実行されます。


2
; たとえば、の使用は非常に危険です(少なくともrmコマンドでは)cd /some/dir; rm -fr ./*。したがって、このような破壊的な操作では、rmを実行する前に適切な場所にいることを確認する必要があります。正しいコマンドはcd /some/dir && rm -fr ./*
-ALex_hha

70
a && b

aがゼロの終了コードを返す場合bが実行されます。

a || b

aがゼロ以外の終了コードを返す場合bが実行されます。

a ; b

aが実行され、次にbが実行されます。


16
cd /fakedir; ls -al

失敗するlsため現在のディレクトリで実行され、cd /fakedirシェルはゼロ以外の終了ステータスを無視します。

cd /fakedir && ls -al

&&前のコマンドが正常に終了した場合(状況がゼロ)のみオペレーターが続行するため、操作はls実行されません。

&プロセスをバックグラウンドにするなど、他の演算子があります。多くの場合、コマンドの最後に配置されますが、チェーンの途中に配置することもできます。


4

また、if..then..elseコマンドロジックをチェーン化するようにそれらを結合することもできます。

例:

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