请参阅以下示例及其在POSIX Shell中的输出:
false;echo $?
或false || echo 1
:1
false;foo="bar";echo $?
或foo="bar" && echo 0
:0
foo=$(false);echo $?
或foo=$(false) || echo 1
:1
foo=$(true);echo $?
或foo=$(true) && echo 0
:0
正如在/programming/6834487/what-is-the-variable-in-shell-scripting中投票最高的答案所提到的:
$?
用于查找最后执行的命令的返回值。
在这种情况下,这可能有点误导,因此让我们获取POSIX定义,该定义也在该线程的帖子中被引用:
?扩展到最新管道的小数退出状态(请参见管道)。
因此,它仿佛是一次分配本身算作一个命令(或者说管道部分)以零退出值,但其应用之前分配的右侧(例如,在我的例子命令替换调用这里)。
我从实际的角度看这种行为是有道理的,但对我而言,分配本身按该顺序进行计数似乎有点不寻常。也许要弄清楚为什么对我来说很奇怪,让我们假设赋值是一个函数:
ASSIGNMENT( VARIABLE, VALUE )
那foo="bar"
会是
ASSIGNMENT( "foo", "bar" )
并且foo=$(false)
会像
ASSIGNMENT( "foo", EXECUTE( "false" ) )
这意味着先EXECUTE
运行,然后才运行,但这仍然是重要的状态。 ASSIGNMENT
EXECUTE
我的评估是否正确,或者我误会/遗漏了什么?这些是我将这种行为视为“奇怪”的正确原因吗?
false;foo="bar";echo $?
当最后一个执行的真实命令false
为时总是返回0 ?” 从根本上说,赋值在退出代码方面表现得很特别。它们的退出代码始终为0,除非不是由于某种原因(作为赋值右侧的一部分而运行)而退出的。