使用 AND 运算符的 echo 命令不退出

使用 AND 运算符的 echo 命令不退出
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

您确定您看到的命令haibye您在此处提供的命令完全在同一行吗?

在直接回答你的问题时,退出状态为零是成功,所以执行第二条语句。 (这允许不同的非零退出状态值指示不同的错误。)

相关内容