一尘不染

在Bash中为命令替换分配变量的退出代码

linux

我对简单地执行变量赋值并使用命令替换时命令将返回的错误代码感到困惑:

a=$(false); echo $?

它输出1,这让我认为变量赋值不会在最后一个赋值时扫掠或产生新的错误代码。但是当我尝试这样做时:

false; a=""; echo $?

它输出0,显然这是a=""返回的内容,并覆盖的1返回false

我想知道为什么会这样,变量赋值与其他普通命令有什么区别吗?还是仅仅因为原因a=$(false)被认为是单个命令而只有命令替换部分才有意义?

-更新-

谢谢大家,在回答和评论中,我明白了“当您使用命令替换分配变量时,退出状态就是命令的状态。”
(由@Barmar撰写),这种解释非常清楚且易于理解,但是对于程序员来说,讲的不够精确,我想从TLDP或GNU手册页等权威机构那里看到这一点的参考,请帮助我找到它出来,再次感谢!


阅读 213

收藏
2020-06-02

共1个答案

一尘不染

在执行命令后,as将$(command)允许命令的输出替换自身

当你说:

a=$(false)             # false fails; the output of false is stored in the variable a

命令产生的输出false存储在变量中a。而且,退出代码与命令产生的代码相同。 help false会告诉:

false: false
    Return an unsuccessful result.

    Exit Status:
    Always fails.

另一方面说:

$ false                # Exit code: 1
$ a=""                 # Exit code: 0
$ echo $?              # Prints 0

使a返回分配的退出代码为0


编辑:

引用手册

如果其中一个扩展包含命令替换,则命令的退出状态为上次执行的命令替换的退出状态。

BASHFAQ / 002引用:

如何在变量中存储命令的返回值和/或输出?

output=$(command)

status=$?

的分配对仍处于中的退出状态output没有影响。command``$?

2020-06-02