相关疑难解决方法(0)

分配就像具有退出状态的命令,除非有命令替换?

请参阅以下示例及其在 POSIX shell 中的输出:

  1. false;echo $?false || echo 11
  2. false;foo="bar";echo $?foo="bar" && echo 00
  3. foo=$(false);echo $?foo=$(false) || echo 11
  4. foo=$(true);echo $?foo=$(true) && echo 00

正如/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 …

shell posix command-substitution assignment exit-status

11
推荐指数
1
解决办法
926
查看次数

获取命令替换的退出状态

如果我将命令替换的输出分配给局部变量,我如何获得命令的退出状态?

这是 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)

zsh shell-script command-substitution exit-status

3
推荐指数
1
解决办法
100
查看次数