私は通常;
は、1行に複数のコマンドを組み合わせますが、一部の人は&&
。違いはありますか?例えば、 cd ~; cd -
およびcd ~ && cd -
は同じことをしているようです。より移植性の高いバージョン、たとえばAndroidのシェルなどのbashサブセットでサポートされますか?
前のコマンドが;
で失敗した場合、2番目のコマンドが実行されます。
ただし、&&
を使用すると、2番目は実行されません。
これは、操作間の「遅延」論理「AND」オペランドです。
&&
を使用しているのは、ずっと前に近くのコンピューターで:
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 *
は安全です...;)
cmd1 && cmd2
、cmd2
は、cmd1
は成功します(0を返します)。
cmd1 ; cmd2
、cmd2
はどのような場合でも実行されます。
両方の構成体は、POSIX準拠のシェルの一部です。
&&
は、前のステータスが0で終了した場合に次のコマンドを実行することを意味します。反対の場合は、||
すなわち、前のコマンドが0以外のステータスで終了した場合に実行される;
は常に実行されます。
前のコマンドが正常に終了したかどうかに応じて特定のアクションを実行する必要がある場合に非常に便利です。
;
で区切られたコマンドは、完了ステータスに関係なく順番に実行されます。
&&
を使用すると、最初のコマンドが正常に完了した場合にのみ2番目のコマンドが実行されます(終了ステータス0が返されます)。
これは、Lists
の下のbashのマンページで説明されています。 Unixライクなシェルがこれらの演算子の両方をサポートすることを期待しますが、Android Shell。
&&
は条件付き実行を許可しますが、;
は常に2番目のコマンドが実行されます。
例えばcommand1 && command2
、command2
は、command1
がexit 0
で終了した場合にのみ実行され、シグナルはすべてうまくいきましたが、command1 ; command2
では、2番目のコマンドは常に実行されます結果はcommand1
でした。
&&はbashでは論理ANDです。 Bashには論理ANDの短絡評価があります。このイディオムは、次を表現するより簡単な方法です。
cmd1;rc=$?
if [ $rc -eq 0 ]; then
cmd2
fi
一方、;バージョンは単に:
cmd1
cmd2