bash / sh-&&と;の違い


136

私は通常;、1行に複数のコマンドを組み合わせるために使用しますが、一部の人はを好み&&ます。違いはありますか?例えば、cd ~; cd -およびcd ~ && cd -同じものを作るようです。より移植性の高いバージョンはどれですか。たとえば、Androidのシェルなどのbashサブセットでサポートされますか?

回答:


193

前のコマンドが;2番目のコマンドで失敗した場合は実行されます。

しかし&&、2番目のものでは実行されません。

これは、操作間の「遅延」論理「AND」オペランドです。


2
言い換えれば、それは短絡動作をしている
peterchaula '12 / 07/12

@peterどっち?;1または&&1?それとも両方を意味しますか?
シャヤン

@Shayan 、&&.
peterchaula

57

&&昔、近くのコンピューターで使っていたので、

root# pwd
/
root# cd /tnp/test; rm -rf *
cd: /tnp/test: No such file or directory
...
... and after a while ...
...   
^C

しかし助けられなかった...;)

cd /tnp/test && rm -rf * 安全です...;)


26
安全のために、私は使用しますrm -rf /tnp/test
melvynkim 2014年

5
さらに安全にするにはrm /tnp/test/ -rf、致命的なミスクリックを防ぐために使用することをお勧めします
radrow

22

ではcmd1 && cmd2、成功したcmd2場合にのみ実行されcmd1ます(0を返します)。

ではcmd1 ; cmd2cmd2どのような場合でも実行されます。

どちらの構造もPOSIX準拠のシェルの一部です。


11

&&前のコマンドがステータス0で終了した場合に次のコマンドを実行することを意味します。逆の場合、||つまり、前のコマンドが0以外のステータスで終了した場合に;常に実行されるように使用します。

前のコマンドが正常に終了したかどうかによって、特定のアクションを実行する必要がある場合に非常に役立ちます。


5

byで区切られたコマンド;は、完了ステータスに関係なく順次実行されます。

を使用する&&と、最初のコマンドが正常に完了した(終了ステータス0を返す)場合にのみ、2番目のコマンドが実行されます。

これは、のbashマンページで説明されていListsます。Unixのようなシェルがこれらの演算子の両方をサポートすることを期待しますが、Androidシェルについて具体的には知りません。


2
bashマニュアルへのリンクは次のとおり
です。gnu.org

3

&&;常に2番目のコマンドが実行されている間、条件付き実行が可能です。

たとえばcommand1 && command2、はで終了したcommand2場合にのみ実行command1されexit 0、すべてのシグナリングが正常に完了しましたがcommand1 ; command2、2番目のコマンドでは、結果が何であっても常に実行されcommand1ます。


1

&&はbashでは論理ANDです。Bashには論理ANDの短絡評価があります。このイディオムは、以下を表現するより簡単な方法です。


cmd1;rc=$?
if [ $rc -eq 0 ]; then
   cmd2
fi

一方、バージョンは単に:


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