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

新手上路,请多包涵

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

 a=$(false); echo $?

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

 false; a=""; echo $?

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

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

- 更新 -

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

原文由 Reorx 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 571
2 个回答

在以 $(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 的退出状态没有影响,退出状态仍然是 $?

原文由 devnull 发布,翻译遵循 CC BY-SA 3.0 许可协议

请注意,与 local 结合时,情况并非如此,如 local variable="$(command)" 。即使 command 失败,该表单也会成功退出。

以这个 Bash 脚本为例:

 #!/bin/bash

function funWithLocalAndAssignmentTogether() {
    local output="$(echo "Doing some stuff.";exit 1)"
    local exitCode=$?
    echo "output: $output"
    echo "exitCode: $exitCode"
}

function funWithLocalAndAssignmentSeparate() {
    local output
    output="$(echo "Doing some stuff.";exit 1)"
    local exitCode=$?
    echo "output: $output"
    echo "exitCode: $exitCode"
}

funWithLocalAndAssignmentTogether
funWithLocalAndAssignmentSeparate

这是这个的输出:

 nick.parry@nparry-laptop1:~$ ./tmp.sh
output: Doing some stuff.
exitCode: 0
output: Doing some stuff.
exitCode: 1

This is because local is actually a builtin command, and a command like local variable="$(command)" calls local after substituting the output of command .所以你从 local 获得退出状态。

原文由 Nick P. 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题