我通常使用 ;在一行中组合多个命令,但有些人更喜欢使用 &&。有区别吗?例如,cd ~; cd -和 cd ~ && cd -似乎做同样的事情。哪个版本更加便携,例如将会被像 Android 的 shell 这样的 bash 子集支持?
;
&&
cd ~; cd -
cd ~ && cd -
在 cmd1 && cmd2中,只有在 cmd1成功(返回0)时才执行 cmd2。
cmd1 && cmd2
cmd1
cmd2
在 cmd1 ; cmd2中,cmd2在任何情况下都是执行的。
cmd1 ; cmd2
这两个构造都是符合 POSIX 的 shell 的一部分。
按 ;分隔的命令按顺序执行,而不管它们的完成状态如何。
对于 &&,只有在第一个命令成功完成(返回退出状态0)时才执行第二个命令。
这在 Lists下的 bash 手册中有介绍。我希望任何类 Unix 的 shell 都能支持这两种操作符,但我不太清楚 Android shell 的具体情况。
Lists
&&表示如果前一个命令以状态0退出,则执行下一个命令。 相反,如果以前的命令退出时的状态总是不等于0,则使用 ||执行。
||
当您需要根据前面的命令是否完成 OK 而采取特定操作时,这非常有用。
&&允许条件执行,而 ;总是执行第二个命令。
例如,在 command1 && command2中,command2只有在 command1与 exit 0终止时才会执行,信令一切正常,而在 command1 ; command2中,无论 command1的结果如何,第二个命令总是会被执行。
command1 && command2
command2
command1
exit 0
command1 ; command2
如果上一个命令与 ;失败,第二个命令将运行。
但对于 &&,第二个不会运行。
这是操作之间的一个“惰性”逻辑“ AND”操作数。
在 bash 中是符合逻辑的。Bash 有逻辑和短路求值。这个成语是表达以下内容的一种更简单的方式:
cmd1;rc=$? if [ $rc -eq 0 ]; then cmd2 fi
而; 版本仅仅是:
cmd1 cmd2
我使用 &&是因为很久以前在附近的电脑:
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 *是安全的... ;)
cd /tnp/test && rm -rf *