如何管道stderr,而不是标准输出?

我有一个将信息写入stdoutstderr ,而我需要grep通过stderr的内容,同时忽略stdout。

我当然可以分两步来做:

command > /dev/null 2> temp.file
grep 'something' temp.file

但我宁愿能够在没有临时文件的情况下执行此操作。 有没有智能管道技巧?


首先将stderr重定向到标准输出 - 管道; 然后将stdout重定向到/dev/null (无需更改stderr将要进行的操作):

command 2>&1 >/dev/null | grep 'something'

有关各种I / O重定向的详细信息,请参阅Bash参考手册中的重定向一章。

请注意,I / O重定向序列从左向右解释,但在解释I / O重定向之前设置了管道。 文件描述符(如1和2)是对打开的文件描述的引用。 操作2>&1使得文件描述符2 aka stderr指向与文件描述符1(也就是stdout当前指的是(参见dup2()open() )相同的打开文件描述。 操作>/dev/null然后更改文件描述符1,以便它指向/dev/null的打开文件描述,但这不会改变文件描述符2引用打开文件描述的事实,即哪个文件描述符1是最初指向 - 即管道。


或者将stderr和stdout的输出交换使用: -

command 3>&1 1>&2 2>&3

这将创建一个新的文件描述符(3)并将其分配到与1(stdout)相同的位置,然后将fd 1(stdout)分配给与fd 2(stderr)相同的位置,最后将fd 2(stderr)分配给相同的位置放置为fd 3(stdout)。 Stderr现在可以作为标准输出和旧stdout保存在stderr中。 这可能是过度的,但希望给出有关bash文件描述符的更多细节(每个进程有9个可用)。


在Bash中,你也可以使用进程替换重定向到一个子shell:

command > >(stdlog pipe)  2> >(stderr pipe)

对于手头的情况:

command 2> >(grep 'something') >/dev/null
链接地址: http://www.djcxy.com/p/13473.html

上一篇: How to pipe stderr, and not stdout?

下一篇: How do I use subprocess.Popen to connect multiple processes by pipes?