& 和之间的 Bash/sh-差异;

我通常使用 ;在一行中组合多个命令,但有些人更喜欢使用 &&。有区别吗?例如,cd ~; cd -cd ~ && cd -似乎做同样的事情。哪个版本更加便携,例如将会被像 Android 的 shell 这样的 bash 子集支持?

76148 次浏览

cmd1 && cmd2中,只有在 cmd1成功(返回0)时才执行 cmd2

cmd1 ; cmd2中,cmd2在任何情况下都是执行的。

这两个构造都是符合 POSIX 的 shell 的一部分。

;分隔的命令按顺序执行,而不管它们的完成状态如何。

对于 &&,只有在第一个命令成功完成(返回退出状态0)时才执行第二个命令。

这在 Lists下的 bash 手册中有介绍。我希望任何类 Unix 的 shell 都能支持这两种操作符,但我不太清楚 Android shell 的具体情况。

&&表示如果前一个命令以状态0退出,则执行下一个命令。 相反,如果以前的命令退出时的状态总是不等于0,则使用 ||执行。

当您需要根据前面的命令是否完成 OK 而采取特定操作时,这非常有用。

&&允许条件执行,而 ;总是执行第二个命令。

例如,在 command1 && command2中,command2只有在 command1exit 0终止时才会执行,信令一切正常,而在 command1 ; command2中,无论 command1的结果如何,第二个命令总是会被执行。

如果上一个命令与 ;失败,第二个命令将运行。

但对于 &&,第二个不会运行。

这是操作之间的一个“惰性”逻辑“ 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 *是安全的... ;)