我有一个这样的测试脚本:
asdf() {
return 1
}
asdf && echo 123 && exit
echo 321
321输出而不是123
为什么?
答案 0 :(得分:1)
echo 123
只会在asdf
之后执行 iff &&
成功执行,因为您已经修复了短路运算符asdf
;现在你有return
- 来自函数asdf
的ed,返回值为1,而后者又成为asdf
的退出状态,因此命令asdf
被认为是失败的,因此<{1}}(当然还有echo 123
)永远不会运行。
exit
上没有这样的条件,因此它以通常的方式执行。
答案 1 :(得分:0)
&&
运算符是逻辑AND。它做了懒惰的评估:如果左边的语句评估为false
(即非零返回码),那么应用逻辑AND仍然会评估为false
,因此评估正确的部分是无用的(在逻辑谓词意义上)。
由于函数返回1(就{B {而言false
而言),右边的所有内容都将被忽略,未达到exit
,并执行echo
语句。
如果要强制执行该行上的所有命令,请改为使用:
{ asdf ; echo 123 ; exit ; }
这样的命令列表将始终评估它们中的每一个,而不管它们的返回代码如何。请注意,最后一个分号是强制性的。