echo hai && echo bye
印刷
hai
bye
尽管
echo hai && echo $?
印刷
hai
0
当第一个echo命令的返回值为 时0
,operator后面的echo语句如何AND
执行?AND
看到返回值不是很快就出来了吗0
?
答案1
您的困惑源于这样一个事实:许多流行语言(尤其是基于 C 的语言)&&
在遇到 0 时停止评估序列,因为 0 被考虑false
,其他一切都是true
。然而,在 Bash 中,情况并非如此。按照惯例,在 POSIX 系统(以及所有其他类 Unix 系统)中,返回代码 0 被视为SUCCESS
(没有错误,因此不返回任何内容),并且考虑非零返回代码FAILURE
。 Bash 中的每个命令,无论是外部程序(例如 C 程序)还是内置 shell,都必须返回一个值:
A简单的命令是一系列可选变量赋值,后跟空格分隔的单词和重定向,并以控制操作员。第一个字指定要执行的命令,并作为参数零传递。其余单词作为参数传递给调用的命令。
a的返回值简单的命令是它的退出状态,或者 128+n如果命令由信号终止n。
(...)
Shell 内置命令返回状态 0 (真的) 如果成功,且非零 (错误的)如果执行时发生错误。所有内置函数都会返回退出状态 2 以指示使用不正确。
不过,返回值不是布尔值。它是 0 到 255 之间的数字:
执行命令的退出状态是由等待进程系统调用或等效函数。退出状态介于 0 到 255 之间,但如下所述,shell 可能会特别使用高于 125 的值。 shell 内置命令和复合命令的退出状态也限于此范围。在某些情况下,shell将使用特殊值来指示特定的故障模式。
对于 shell 而言,以零退出状态退出的命令已成功。 退出状态为零表示成功。非零退出状态表示失败。 当命令因致命信号而终止时氮,bash使用的值是128+氮作为退出状态。
(加粗我的。)
当命令将其返回代码报告回 shell 时,通常检查退出代码是否为 0 就足够了。
&&
现在,仅当前一个命令返回 0 时,才会执行粘合在一起的列表中的下一个命令,即SUCCESS
:
AND 和 OR 列表是分别由
&&
和||
控制运算符分隔的一个或多个管道的序列。 AND 和 OR 列表以左关联性执行。 AND 列表的形式为命令1&&命令2命令2被执行当且仅当命令1返回退出状态为零。
答案2
命令的返回值与典型的布尔值不同。执行命令时0表示成功,其他表示失败。由于这个原因,&& 预计我在这里的成功率为 0。
答案3
在这里,也使用zsh
,我有
echo hai && echo bye
hai
bye
同样地
echo hai && echo %?
hai
0
您确定您看到的命令hai
与bye
您在此处提供的命令完全在同一行吗?
在直接回答你的问题时,退出状态为零是成功,所以执行第二条语句。 (这允许不同的非零退出状态值指示不同的错误。)