请参阅以下示例及其在 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
正如/sf/ask/478414121/ 上投票最高的答案所提到的:
$?
用于查找上次执行命令的返回值。
在这种情况下,这可能有点误导,所以让我们获取 POSIX 定义,该定义也在该线程的帖子中引用:
? 扩展到最近管道的十进制退出状态(请参阅管道)。
所以看起来好像一个赋值本身算作一个命令(或者更确切地说是一个管道部分),它的退出值为零,但它应用在赋值的右侧之前(例如,我的示例中的命令替换调用)。
从实际的角度来看,我看到这种行为是有道理的,但对我来说,作业本身按该顺序计数似乎有些不寻常。也许为了让我更清楚为什么这对我来说很奇怪,让我们假设赋值是一个函数:
ASSIGNMENT( VARIABLE, VALUE )
Run Code Online (Sandbox Code Playgroud)
那么foo="bar"
将是
ASSIGNMENT( "foo", "bar" )
Run Code Online (Sandbox Code Playgroud)
并且foo=$(false)
会像
ASSIGNMENT( "foo", EXECUTE( "false" ) )
Run Code Online (Sandbox Code Playgroud)
这意味着首先EXECUTE …
如果我将命令替换的输出分配给局部变量,我如何获得命令的退出状态?
这是 ZSH 5.8 的行为:
false; echo $? # output is 1 as expected
foo=$(false); echo $? # output is 1 as expected
local foo=$(false); echo $? # output is 0
Run Code Online (Sandbox Code Playgroud)