双&符号(&&)和分号(;)在Linux Bash?

s6fujrry  于 2023-01-04  发布在  Linux
关注(0)|答案(4)|浏览(146)

在Linux Bash中,和号和分号有什么区别?
例如,

$ command1 && command2

对比

$ command1; command2
mspsb9vt

mspsb9vt1#

&&运算符是布尔AND运算符:如果左侧返回一个非零的退出状态,操作符返回该状态并且不计算右侧(它短路),否则它计算右侧并返回其退出状态。这通常用于确保command2仅在command1成功运行时才运行。
;标记只是分隔命令,因此无论第一个命令是否成功,它都将运行第二个命令。

x6492ojm

x6492ojm2#

命令1和命令2

当(且仅当)command1执行成功结束时,command1 && command2才执行command2。在Unix行话中,这意味着 exit code / return code 等于零。

命令1;命令2

command1; command2在顺序执行command1之后执行command2。命令是否成功无关紧要。

gt0wga4j

gt0wga4j3#

前者是使用短路评估的简单逻辑AND,后者简单地界定两个命令。
真实的情况是,当第一个程序返回一个非零的退出代码时,整个AND的值被计算为FALSE,第二个命令不会被执行,后者只是按顺序执行它们。

hvvq6cgz

hvvq6cgz4#

第一个月
...运行cmd 1,然后运行cmd 2。
cmd1 && cmd2
...如果cmd 1以代码零退出,则运行cmd 2。
这两种方法都产生最后执行的命令的状态代码。
然而,其他答案错过了什么...
你可能认为cmd1 && cmd2(cmd1 && cmd2)是相同的。事实上,它们是非常不同的。因为哪个命令没有括号会失败。
请考虑以下内容:取消注解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是有意义的,与其他的区别也是有意义的--parins创建了一个subshell,但是下面两个都产生了状态1,但是只有seconds退出脚本,这真的很奇怪:

false && true  
true && false

相关问题