当前位置: 首页 > 面试题库 >

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

范甫
2023-03-14
问题内容

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

a=$(false); echo $?

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

false; a=""; echo $?

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

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

-更新-

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


问题答案:

在执行命令后,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``$?



 类似资料:
  • 它输出,这让我认为变量赋值不会扫过上一个错误代码,也不会产生新的错误代码。但当我尝试这个的时候: 它输出,显然这就是返回的内容,它重写返回的。 我想知道为什么会发生这种情况,变量赋值有什么特殊性,不同于其他正常命令吗?或者仅仅是因为被认为是一个命令,只有命令替换部分才有意义? --更新-- 谢谢大家,从答案和评论中,我得到了这样一个观点:“当您使用命令替换分配变量时,退出状态就是命令的状态。”(作

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

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

  • 我有3个node K8S集群,我创建了3个副本POD,所有的POD上都运行了Application-App1,我通过运行服务yaml文件建立了服务,我可以看到我的集群-IP通过运行kubectl get服务创建的 当我尝试从其中一个节点进行卷曲时,我得到了“卷曲:(7)连接失败-连接失败”,当我尝试在我得到的pod内卷曲时...“命令终止,退出代码7” 运行的命令: kubectl运行kubia-

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

  • 我正在为Phonegap开发设置一个环境,我遇到了一些麻烦,最终构建和运行适用于Android的应用程序。 当我尝试执行Android构建时,出现以下错误: 一些细节: 我在 Windows 8.1 上运行; 我使用的是Android SDK 22; 我已经为 JDK、Android(工具、构建工具和平台工具)、Ant 和 Gradle 创建了环境变量。 任何想法为什么我会收到此错误? 谢谢。