为什么这个bash快捷方式不起作用?
我有这样一个测试脚本:为什么这个bash快捷方式不起作用?,bash,shell,Bash,Shell,我有这样一个测试脚本: asdf() { return 1 } asdf && echo 123 && exit echo 321 输出的是321而不是123 为什么会这样?echo 123只会在如果asdf成功执行,因为您在asdf之后处理了短路操作--和&;现在您已经从函数asdf-ed中返回了return,返回值为1,这反过来成为asdf的退出状态,因此命令asdf被视为失败,因此echo 123(当然还有exit)永远不会运行 echo 321上没
asdf() {
return 1
}
asdf && echo 123 && exit
echo 321
输出的是321而不是123
为什么会这样?
echo 123
只会在如果asdf
成功执行,因为您在asdf
之后处理了短路操作--和&
;现在您已经从函数asdf
-ed中返回了return
,返回值为1,这反过来成为asdf
的退出状态,因此命令asdf
被视为失败,因此echo 123
(当然还有exit
)永远不会运行
echo 321上没有这种条件,因此它是以通常的方式执行的。运算符是逻辑AND。它执行延迟求值:如果左边的语句求值为false
(即非零返回代码),则无论如何应用逻辑AND仍将求值为false
,因此求值右边的部分是无用的(在逻辑谓词意义上)
由于函数返回1(false
,就Bash而言),因此忽略右侧的所有内容,不会到达exit
,并且执行echo
语句
如果要强制执行该行上的所有命令,请改用此命令:
{ asdf ; echo 123 ; exit ; }
像这样的命令列表将始终计算它们中的每一个,而不管它们的返回代码如何。请注意,最后一个分号是必需的。在讨论退出状态时,请尽量不要使用布尔术语bash确实有一个上下文,其中布尔值用true表示为1,false表示为0,即算术表达式(tryecho$((3<5))
),因此最好保持真理和成功的概念不同。