【问题标题】:How to redirect stderr to stdout and to stderr itself如何将标准错误重定向到标准输出和标准错误本身
【发布时间】:2015-09-16 12:08:25
【问题描述】:

我想做的是在不改变标准错误输出的情况下将标准错误重定向到标准输出。

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

我试过了

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

$line 传递了所需的信息,但屏幕没有显示任何输出。

我试过了

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

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

【问题讨论】:

  • 为什么不在你的第一个代码 sn-p 之后添加 'echo $line'?

标签: linux bash shell unix io-redirection


【解决方案1】:

您可以使用重定向以正确的顺序复制流。考虑:

% 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>&1stderr 复制到 stdout

所以 stdout 和 stderr 都得到相同的流。 然后对 stdout 进行 greped。

【讨论】:

  • 不过,在这种情况下,您只是在 grepping 标准错误,而 OP 想要输出标准错误并存储标准输入(我认为)。
  • @999999999999999999999999999999 我编辑了这篇文章。我正在通过标准输出和标准错误,sh out.sh 1>&2 2>&1 | grep ERR > /tmp/a 之后,/tmp/a 包含 ERR,sh out.sh 1>&2 2>&1 | grep OUT > /tmp/a 之后,/tmp/a 包含 OUT
【解决方案2】:

您可以对一些流程替换感到满意:

$ 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2022-12-14
    • 2012-08-15
    • 2011-10-11
    相关资源
    最近更新 更多