首页 文章

在bash中管道stdout和stderr?

提问于
浏览
110

似乎较新版本的bash有 &> 运算符,如果我理解正确的话,将stdout和stderr重定向到一个文件( &>> 将附加到文件,而Adrian澄清) .

实现相同目标的最简单方法是什么,而是管道到另一个命令?

例如,在这一行:

cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError

我希望grep能够匹配stdout和stderr中的内容(实际上,将它们组合成一个流) .

注意:这个问题是询问管道,而不是重定向 - 因此它不是它当前标记为重复的问题的副本 .

2 回答

  • 70

    Bash有 2>&1 | 的简写,即 |& ,它管道stdout和stderr(参见manual):

    cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError
    

    这是在Bash 4.0中引入的,请参阅release notes .

  • 123

    (注意 &>>file 附加到文件,而 &> 将重定向并覆盖以前存在的文件 . )

    要组合 stdoutstderr ,您可以使用 2>&1 将后者重定向到前者 . 这将stderr(文件描述符2)重定向到stdout(文件描述符1),例如:

    $ { echo "stdout"; echo "stderr" 1>&2; } | grep -v std
    stderr
    $
    

    stdout 去了stdout, stderr 去了stderr . grep 只看到 stdout ,因此 stderr 打印到终端 .

    另一方面:

    $ { echo "stdout"; echo "stderr" 1>&2; } 2>&1 | grep -v std
    $
    

    写入stdout和stderr后, 2>&1 将stderr重定向回stdout, grep 在stdin上查看两个字符串,从而过滤掉两者 .

    您可以阅读有关重定向here的更多信息 .

    关于你的例子(POSIX):

    cmd-doesnt-respect-difference-between-stdout-and-stderr 2>&1 | grep -i SomeError
    

    或者,使用 >=bash-4

    cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError
    

相关问题