首页 文章

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

提问于
浏览
0

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

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

我试过了

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

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

我试过了

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

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

2 回答

  • 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
    
  • 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了 .

相关问题