我需要在bash脚本中捕获命令的输出和错误,并知道命令是否成功。
目前,我正在捕捉这两个:
output=$(mycommand 2>&1)
然后我需要检查mycommand的退出值。如果失败了,我需要对输出做一些事情,如果命令成功,我不需要触摸输出。
由于我正在捕获输出,检查$?因为bash成功将输出捕获到变量中,所以总是为0。
这是一个非常时间敏感的脚本,所以我们试图避免任何较慢的解决方案,例如输出到文件并重新读取它。
如果我可以将stdout捕获到一个变量并将stderr捕获到另一个变量,这将解决我的问题,因为我可以检查错误变量是否为空。
感谢。
答案 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