shell:在两个不同的变量中捕获命令输出并返回状态

Hip*_*Man 4 shell redirect stdout return-code

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

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

command >tempfile
rc=$?
output=$(cat tempfile)
Run Code Online (Sandbox Code Playgroud)

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

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

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

output=$(command)
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以提出一种在不使用任何文件的情况下将返回码和命令的输出都放入两个 shell 变量的方法吗?

非常感谢。

Joh*_*024 5

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

$ output=$(true); rc=$?; echo $rc
0
$ output=$(false); rc=$?; echo $rc
1
Run Code Online (Sandbox Code Playgroud)

一项任务中的多个命令替换

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

$ output="$(true) $(false)"; rc=$?; echo $rc
1
$ output="$(false) $(true)"; rc=$?; echo $rc
0
Run Code Online (Sandbox Code Playgroud)

文档

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

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