bash变量分别捕获stderr和stdout或获取退出值

发布于 2024-09-18 00:20:13 字数 382 浏览 6 评论 0原文

我需要捕获 bash 脚本中命令的输出和错误,并知道该命令是否成功。

目前,我正在像这样捕获两者:

output=$(mycommand 2>&1)

然后我需要检查 mycommand 的退出值。如果失败,我需要对输出做一些事情,如果命令成功,我不需要触摸输出。

由于我正在捕获输出,因此检查 $?始终为 0,因为 bash 成功将输出捕获到变量中。

这是一个对时间非常敏感的脚本,因此我们试图避免任何较慢的解决方案,例如输出到文件并重新读入。

如果我可以将 stdout 捕获到一个变量并将 stderr 捕获到另一个变量,那将解决我的问题,因为我可以只需检查错误变量是否为空。

谢谢。

I need to capture the output and error of a command in my bash script and know whether the command succeeded or not.

At the moment, I am capturing both like this:

output=$(mycommand 2>&1)

I then need to check the exit value of mycommand. If it failed, I need to do some stuff with the output, if the command succeeded, I don't need to touch the output.

Since I am capturing the output, checking $? is always a 0 since bash succeeded at capturing the output into the variable.

This is a very time sensitive script, so we are trying to avoid any slower solutions like outputting to a file and re-reading it in.

If I could capture stdout to one variable and stderr to another, that would solve my problem because I could just check if the error variable was empty or not.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

戈亓 2024-09-25 00:20:13

您使用的 bash 版本是什么?对于我的版本 4.1.5,输出的捕获对返回代码的影响

pax> false; echo $?
1
pax> echo $?
0
pax> x=$(false 2>&1) ; echo $?
1

依靠非空标准错误来执行错误并不总是一个好主意。检测错误。许多程序不输出错误,而是依赖返回代码。

What version of bash are you using? The capture of the output has zero effect on the return code with my version, 4.1.5:

pax> false; echo $?
1
pax> echo $?
0
pax> x=$(false 2>&1) ; echo $?
1

It's not always a good idea to rely on standard error being non-empty to detect errors. Many programs don't output errors but rely solely on the return code.

洛阳烟雨空心柳 2024-09-25 00:20:13

仅当输出被捕获到函数内的本地变量时,问题似乎才显现出来:

$ echo $BASH_VERSION
3.2.48(1)-release
$ false; echo $?
1
$ echo $?
0
$ x=$(false 2>&1) ; echo $?
1
$ function f {
> local x=$(false 2>&1) ; echo $?
> }
$ f
0
$ function g {
> x=$(false 2>&1) ; echo $?
> }
$ g
1

请注意,只有将 x 捕获到本地的函数 f 才能表达该行为。特别是,函数 g 可以做同样的事情,但没有 'local' 关键字。

因此,不能使用局部变量,并且可能在使用后“取消设置”它。

编辑 NVRAM指出可以提前进行本地声明以避免该问题:

$ function h {
>   local x
>   x=$(false 2>&1) ; echo $?
> }
$ h
1

The problem only seems to manifest when the output is captured to a local variable within a function:

$ echo $BASH_VERSION
3.2.48(1)-release
$ false; echo $?
1
$ echo $?
0
$ x=$(false 2>&1) ; echo $?
1
$ function f {
> local x=$(false 2>&1) ; echo $?
> }
$ f
0
$ function g {
> x=$(false 2>&1) ; echo $?
> }
$ g
1

Notice that only function f, which captures x to a local, can express the behavior. Particularly, function g which does the same thing, but without the 'local' keyword, works.

One can therefore not use a local variable, and perhaps 'unset' it after use.

EDIT NVRAM points out that the local declaration can be made beforehand to avoid the issue:

$ function h {
>   local x
>   x=$(false 2>&1) ; echo $?
> }
$ h
1
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文