如何管道stderr,而不是标准输出?
我有一个将信息写入stdout
和stderr
,而我需要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?