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

时间:2010-09-03 02:03:29

标签: bash variables stdout capture stderr

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

目前,我正在捕捉这两个:

output=$(mycommand 2>&1)

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

由于我正在捕获输出,检查$?因为bash成功将输出捕获到变量中,所以总是为0。

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

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

感谢。

2 个答案:

答案 0 :(得分:10)

您使用的是什么版本的bash?输出的捕获对我的版本4.1.5的返回代码具有效果:

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

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

答案 1 :(得分:10)

当输出被捕获到函数中的 local 变量时,似乎只会出现问题:

$ 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