【问题标题】:shell: capture command output and return status in two different variablesshell:在两个不同的变量中捕获命令输出和返回状态
【发布时间】:2016-09-07 01:35:39
【问题描述】:

假设我使用的是 bash 或 zsh 之类的 shell,并且还假设我有一个写入标准输出的命令。我想将命令的输出捕获到一个 shell 变量中,并将命令的返回码捕获到另一个 shell 变量中。

我知道我可以做这样的事情......

command >tempfile
rc=$?
output=$(cat tempfile)

然后,我在“rc”shell 变量中有返回码,在“output”shell 变量中有命令的输出。

但是,我想在不使用任何临时文件的情况下执行此操作。

另外,我可以这样做来获取命令输出...

output=$(command)

...但是,我不知道如何将命令的返回码放入任何 shell 变量中。

谁能建议一种在不使用任何文件的情况下将返回代码和命令输出都放入两个 shell 变量的方法?

非常感谢。

【问题讨论】:

    标签: shell redirect stdout return-code


    【解决方案1】:

    只需像以前一样捕获$?。使用可执行文件truefalse,我们可以证明命令替换 确实设置了正确的返回码:

    $ output=$(true); rc=$?; echo $rc
    0
    $ output=$(false); rc=$?; echo $rc
    1
    

    一个作业中的多个命令替换

    如果一个赋值中出现多个命令替换,最后一个命令替换的返回码决定了赋值的返回码:

    $ output="$(true) $(false)"; rc=$?; echo $rc
    1
    $ output="$(false) $(true)"; rc=$?; echo $rc
    0
    

    文档

    来自man bash描述变量赋值的部分:

    如果其中一个扩展包含命令替换,则退出 命令的状态是最后一个命令的退出状态 进行了替换。如果没有命令替换,则 命令以零状态退出。

    【讨论】:

    • 由于某种原因,当我尝试这种确切的方法时,rc 没有正确设置。我的测试脚本一定有另一个我错过的错误。无论如何,这就是我正在寻找的答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多