#!/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
4条答案
按热度按时间mspsb9vt1#
&&
运算符是布尔AND运算符:如果左侧返回一个非零的退出状态,操作符返回该状态并且不计算右侧(它短路),否则它计算右侧并返回其退出状态。这通常用于确保command2
仅在command1
成功运行时才运行。;
标记只是分隔命令,因此无论第一个命令是否成功,它都将运行第二个命令。x6492ojm2#
命令1和命令2
当(且仅当)
command1
执行成功结束时,command1 && command2
才执行command2
。在Unix行话中,这意味着 exit code / return code 等于零。命令1;命令2
command1; command2
在顺序执行command1
之后执行command2
。命令是否成功无关紧要。gt0wga4j3#
前者是使用短路评估的简单逻辑
AND
,后者简单地界定两个命令。真实的情况是,当第一个程序返回一个非零的退出代码时,整个
AND
的值被计算为FALSE
,第二个命令不会被执行,后者只是按顺序执行它们。hvvq6cgz4#
第一个月
...运行cmd 1,然后运行cmd 2。
cmd1 && cmd2
...如果cmd 1以代码零退出,则运行cmd 2。
这两种方法都产生最后执行的命令的状态代码。
然而,其他答案错过了什么...
你可能认为
cmd1 && cmd2
和(cmd1 && cmd2)
是相同的。事实上,它们是非常不同的。因为哪个命令没有括号会失败。请考虑以下内容:取消注解
set -e
可以确定状态代码D和E是有意义的,与其他的区别也是有意义的--parins创建了一个subshell,但是下面两个都产生了状态1,但是只有seconds退出脚本,这真的很奇怪: