在bash中pipe道stdout和stderr?
看来新版本的bash有&>
运算符(如果我理解正确的话),将stdout和stderrredirect到一个文件( &>>
追加到文件中,正如Adrian所阐明的那样)。
实现同样的事情最简单的方法是什么,而是滚动到另一个命令?
例如,在这一行中:
cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError
我希望grep匹配stdout和stderr中的内容(实际上,将它们合并为一个stream)。
注意 :这个问题是关于pipe道问题, 而不是redirect – 所以它不是它现在被标记为重复的问题的重复。
(请注意, &>>file
附加到文件,而&>
会redirect并覆盖以前存在的文件。)
要结合stdout
和stderr
你可以使用2>&1
将后者redirect到前者。 这将stderr(文件描述符2)redirect到stdout(文件描述符1),例如:
$ { echo "stdout"; echo "stderr" 1>&2; } | grep -v std stderr $
stdout
去标准输出, stderr
去stderr。 grep
只看到stdout
,因此stderr
打印到terminal。
另一方面:
$ { echo "stdout"; echo "stderr" 1>&2; } 2>&1 | grep -v std $
写入stdout和stderr之后, 2>&1
将stderrredirect回stdout,而grep
看到stdin上的两个string,从而将两者都过滤掉。
你可以在这里阅读更多关于redirect。
关于你的例子(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
Bash有2>&1 |
的简写 ,即|&
,哪个pipe道stdout和stderr(见手册 ):
cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError
这是在Bash 4.0中引入的,请参阅发行说明 。