web-dev-qa-db-ja.com

Bash / sh-&&と;の違い

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

118
psihodelia

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

ただし、&&を使用すると、2番目は実行されません。

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

172
ignar

&&を使用しているのは、ずっと前に近くのコンピューターで:

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 *は安全です...;)

52
jm666

cmd1 && cmd2cmd2は、cmd1は成功します(0を返します)。

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

両方の構成体は、POSIX準拠のシェルの一部です。

20
Pascal Cuoq

&&は、前のステータスが0で終了した場合に次のコマンドを実行することを意味します。反対の場合は、||すなわち、前のコマンドが0以外のステータスで終了した場合に実行される;は常に実行されます。

前のコマンドが正常に終了したかどうかに応じて特定のアクションを実行する必要がある場合に非常に便利です。

8
Fredrik Pihl

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

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

これは、Listsの下のbashのマンページで説明されています。 Unixライクなシェルがこれらの演算子の両方をサポートすることを期待しますが、Android Shell。

5
Dave Costa

&&は条件付き実行を許可しますが、;は常に2番目のコマンドが実行されます。

例えばcommand1 && command2command2は、command1exit 0で終了した場合にのみ実行され、シグナルはすべてうまくいきましたが、command1 ; command2では、2番目のコマンドは常に実行されます結果はcommand1でした。

3
Marcel

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


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

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


cmd1
cmd2
1
frankc