Linux Bash中&号和分号的区别是什么?

例如,

$ command1 && command2

vs

$ command1; command2

&&操作符是一个布尔AND操作符:如果左边返回一个非零的退出状态,操作符将返回该状态,而不计算右边(它会短路),否则它计算右边并返回其退出状态。这通常用于确保只有在command1成功运行时才运行command2。

的;令牌只是分开命令,所以不管第一个命令是否成功,它都会运行第二个命令。


Command1 && command2

当(且仅当)Command1执行成功时,Command1 && command2执行command2。在Unix行话中,这意味着退出代码/返回代码等于零。

command1;command2

command1;Command2在执行command1之后,依次执行Command2。命令是否成功并不重要。


前者是一个简单的逻辑和使用短路求值,后者简单地划分两个命令。

实际情况是,当第一个程序返回非零退出码时,整个AND被计算为FALSE,第二个命令将不会执行。后者只是按顺序执行它们。


cmd1;cmd2

... 运行cmd1,然后运行cmd2。

Cmd1 && cmd2

... 如果cmd1的退出代码为0,则运行cmd2。

两者都会生成最后执行命令的状态代码。

然而,其他的答案漏掉了…

您可能认为cmd1 && cmd2和(cmd1 && cmd2)是相同的。事实上,它们非常不同。如果没有paren,哪个命令会失败。

考虑以下几点。状态代码由取消注释set -e决定

#!/bin/bash
set -e # exit on error
set -x

# false    # Yields status 1 and would cause the script to exit if -x is left uncommented

true && true     # Does not exit script! Good
echo A $?        # 0

false && true    # Does not exit script! Wut?
echo B $?        # 1

true && false    # Exits the script.  Wut? Wut?
echo C $?        # 1, if not -e

(false && true)  # Exits the script
echo D $?        # 1, if not -e

(true && false)  # Exits the script
echo E $?        # 1, if not -e

D和E是有意义的,与其他的区别是有意义的- parens创建了一个子壳。然而,以下两个结果都是1,但只有秒退出脚本,这真的很奇怪:

false && true  
true && false