Linux Bash中&号和分号的区别是什么?
例如,
$ command1 && command2
vs
$ command1; command2
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