echo hai && echo bye
Run Code Online (Sandbox Code Playgroud)
印刷
hai
bye
Run Code Online (Sandbox Code Playgroud)
尽管
echo hai && echo $?
Run Code Online (Sandbox Code Playgroud)
印刷
hai
0
Run Code Online (Sandbox Code Playgroud)
当第一条echo命令的返回值为 时0,ANDoperator后的echo语句是如何执行的?AND看到返回值是不是很快就出来了0?
Ark*_*zyk 23
您的困惑源于许多流行语言(尤其是基于 C 的语言)&&在遇到 0 时停止评估序列,因为 0 被考虑false,其他一切都是true。然而,在 Bash 中,情况并非如此。按照惯例,在 POSIX 系统(以及所有其他类 Unix 系统)中,会考虑返回代码 0 SUCCESS(没有错误,因此不会返回任何内容),并且会考虑非零返回代码FAILURE。Bash 中的每个命令,无论是外部程序,如 C 程序还是内置的 shell,都必须返回一个值:
一个简单的命令是一系列可选的变量赋值,后跟空格分隔的单词和重定向,并以控制运算符结束。第一个字指定要执行的命令,并作为参数零传递。其余的词作为参数传递给调用的命令。
一个的返回值简单的命令是它的退出状态,或128+ Ñ如果命令是通过信号终止Ñ。
(……)
如果成功,Shell 内置命令将返回状态 0 ( true ),如果在执行时发生错误,则返回非零 ( false ) 状态。所有内置函数都返回退出状态 2 以指示不正确的使用。
但是,返回值不是布尔值。它是一个介于 0 和 255 之间的数字:
执行命令的退出状态是waitpid系统调用或等效函数返回的值。退出状态介于 0 和 255 之间,但如下所述,shell 可能会特别使用 125 以上的值。shell 内置命令和复合命令的退出状态也仅限于此范围。在某些情况下,外壳会使用特殊值来指示特定的故障模式。
出于 shell 的目的,以零退出状态退出的命令已成功。 退出状态为零表示成功。非零退出状态表示失败。 当命令在致命信号N上终止时,bash 使用 128+ N的值作为退出状态。
(加粗我的。)
当命令将其返回码报告回 shell 时,通常检查退出码是否为 0 就足够了。
现在,&&仅当前一个命令返回 0时,才会执行与 粘合在一起的列表中的下一个命令- 即SUCCESS:
AND 和 OR 列表分别是由
&&和||控制运算符分隔的一个或多个管道的序列 。AND 和 OR 列表以左结合性执行。AND 列表具有以下形式命令1 &&命令2命令2,如果执行,且仅当是command1返回零退出状态。