当前位置: 首页 > 知识库问答 >
问题:

Bash中变量赋值到命令替换的退出代码

孟宏才
2023-03-14
a=$(false); echo $?

它输出1,这让我认为变量赋值不会扫过上一个错误代码,也不会产生新的错误代码。但当我尝试这个的时候:

false; a=""; echo $?

它输出0,显然这就是a=“”返回的内容,它重写false返回的1

我想知道为什么会发生这种情况,变量赋值有什么特殊性,不同于其他正常命令吗?或者仅仅是因为a=$(false)被认为是一个命令,只有命令替换部分才有意义?

--更新--

谢谢大家,从答案和评论中,我得到了这样一个观点:“当您使用命令替换分配变量时,退出状态就是命令的状态。”(作者@barmar),这个解释非常清晰易懂,但是对于程序员来说还不够精确,我想看看TLDP或GNU手册页等权威机构对这一点的引用,请帮我找到,再次感谢!

共有1个答案

东门新立
2023-03-14

在以$(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

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

引自BashFAQ/002:

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

 类似资料:
  • 问题内容: 我对简单地执行变量赋值并使用命令替换时命令将返回的错误代码感到困惑: 它输出,这让我认为变量赋值不会在最后一个赋值时扫掠或产生新的错误代码。但是当我尝试这样做时: 它输出,显然这是返回的内容,并覆盖的返回。 我想知道为什么会这样,变量赋值与其他普通命令有什么区别吗?还是仅仅因为原因被认为是单个命令而只有命令替换部分才有意义? -更新- 谢谢大家,在回答和评论中,我明白了“当您使用命令替

  • 问题内容: 我必须找到具有选定权限的文件,并列出它们及其编号。因此,我想将命令的结果传递给shell和下一个命令,该输出我想存储在变量中,以便以后可以很好地显示。我想吃点东西 但部分无效。请帮忙。 编辑 我知道我可以将命令的整个输出放到像这样的变量中 但是然后我只需要的结果。我如何从该变量中获得该数字?是否可以按相反的顺序显示它,先显示编号,然后显示列表? 问题答案: 复制到TTY(不是标准输出!

  • 问题内容: 我正在尝试将命令输出重定向到变量: 然后阅读: 运行它时,输出如下: 但是变量保持空白。对于其他命令,我已经尝试过相同的方法,并且一切正常。 这会将文件列表写入变量,以便以后可以读取。我应该怎么做才能使其正常工作? 问题答案: 也许输出去了,不是吗? 尝试这个:

  • 问题内容: 我可以在node.js中运行bash命令,如下所示: 如何获得该命令的退出代码(在此示例中)?我试过跑步 尽管如此,无论上一个命令的退出代码如何,它总是返回0。我想念什么? 问题答案: 这两个命令在单独的shell中运行。 要获取代码,您应该能够签入回调。 如果这不起作用,则需要添加一个事件处理程序 例如

  • 我该如何做到这一点?谢了!

  • 问题内容: 我在Linux上使用bash shell。我有这个简单的脚本…… 但是,当我运行此脚本时 打印所有输出而没有回车/换行。不知道这是我将输出存储到$ TEMP还是echo命令本身的方式。 如何将命令的输出存储到变量并保留换行符/回车符? 问题答案: 引用 您的变量。原因如下: 不带引号的外壳将替换为其包含的字符(其中之一是换行符)。然后,在调用shell 之前,先使用(IFS)将该字符串