我在bash中运行git push命令,这会产生一些错误。
RESPONSE=$(git push "$target" --all | grep "error:" || true)
在屏幕上生成输出,但变量$ RESPONSE为空
如果我更改命令来执行此操作:
RESPONSE=$(git push "$target" --all 2>&1 | grep "error:" || true)
命令以静默方式运行,但实际上捕获了$ RESPONSE中所需的错误
echo $RESPONSE
我确实需要以某种方式运行此git push命令,以使其在$ RESPONSE中保留上面的错误,但在屏幕上生成整个输出。
运行
RESPONSE=$(git push "$target" --all 2>&1 | tee -a log | grep "error:" || true)
没有帮助,除非我丢失了一些东西。 最佳答案
一种解决方案是使用tee
;只是不完全符合您的显示方式。逐步执行它可能会使解决方案更容易理解:
git push "$target" --all
会将您想要的错误发送给STDERR。因此,您添加了
2>&1
,将STDERR重定向到STDOUT。git push "$target" --all 2>&1
然后,您的管道(grep等)可以将其拾取,并且最终变量捕获可以在执行该操作时看到它
RESPONSE=$(git push "$target" --all 2>&1 | grep "error:" || true)
但是由于错误不再传递给STDERR,并且现在捕获了STDOUT而不是将其发送到屏幕,因此输出消失了。
因此,要使用
tee
的目的是将输出同时放在STDERR(用于屏幕)和STDOUT(用于管道和最终变量捕获)上。RESPONSE=$(git push "$target" --all 2>&1 |tee >(cat 1>&2) | grep "error:" || true)
这可能会按您希望的方式工作,但是请注意,您在屏幕上看到的所有内容-
git
命令的所有输出,错误或其他内容-现在都将通过STDERR传递。并没有很多实际的原因,为什么这比捕获变量然后回显变量的答案更好(每个miimote的答案),但是如果出于某种原因,非顺序命令结构对您来说看起来更好,那是方法。