我在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的答案),但是如果出于某种原因,非顺序命令结构对您来说看起来更好,那是方法。

08-27 18:01
查看更多