如何将stderr重定向到stdout和stderr本身

时间:2015-09-16 12:08:25

标签: linux bash shell unix io-redirection

我想要做的是将stderr重定向到stdout而不改变stderr的输出。

说,command在stderr中有输出,我想把所有的stderr放到屏幕上,同时也通过grep处理信息并将其保存到变量。

我试过

line=$(command 2>&1  | grep 'aaa' )

$ line与所需信息一起传递,但屏幕不显示任何输出。

我试过

line=$(command 2>&1 | tee >&2 |grep 'aaa' )

这可以很好地用于屏幕上的信息输出,但$ line没有任何价值。

2 个答案:

答案 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重复stdoutstderr
  • 2>&1重复stderrstdout

因此stdout和stderr都获得相同的流。 然后stdout就是greped。