我想要做的是将stderr重定向到stdout而不改变stderr的输出。
说,command
在stderr中有输出,我想把所有的stderr放到屏幕上,同时也通过grep处理信息并将其保存到变量。
我试过
line=$(command 2>&1 | grep 'aaa' )
$ line与所需信息一起传递,但屏幕不显示任何输出。
我试过
line=$(command 2>&1 | tee >&2 |grep 'aaa' )
这可以很好地用于屏幕上的信息输出,但$ line没有任何价值。
答案 0 :(得分:0)
您可以对某些流程替换感到满意:
$ sh -c 'echo stdout; echo stderr >&2'
stdout
stderr
$ output=$( sh -c 'echo stdout; echo stderr >&2' 2> >( tee >( cat >&2) ) )
# ...............................................^^^^^^^^^^^^^^^^^^^^^^^
stderr
$ echo "$output"
stdout
stderr
答案 1 :(得分:0)
您可以按正确的顺序使用重定向复制流。考虑:
% cat out.sh
echo "OUT"
echo "ERR" 1>&2
运行:
% sh out.sh 1>&2 2>&1 | grep OUT > /tmp/a
ERR
OUT
% cat /tmp/a
OUT
这似乎是你所期待的。现在它为什么有效?
1>&2
重复stdout
至stderr
2>&1
重复stderr
至stdout
因此stdout和stderr都获得相同的流。 然后stdout就是greped。