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