如何将 stderr 重定向而不重定向 stdout?
如何将 stderr 重定向而不重定向 stdout?
我有一个程序,它将信息写入stdout
和stderr
,我需要使用grep
处理stderr
,把stdout
排除在外。
使用一个临时文件,可以分为两步完成:
command > /dev/null 2> temp.file grep 'something' temp.file
但是如何在不使用临时文件的情况下,使用一条命令和管道实现呢?
admin 更改状态以发布 2023年5月24日
首先将stderr重定向到stdout(管道);然后将stdout重定向到/dev/null
(而不改变stderr的目的地):
command 2>&1 >/dev/null | grep 'something'
有关各种I/O重定向的详细信息,请参阅Bash参考手册中的重定向一章。
请注意,I/O重定向的顺序是从左到右解释的,但是管道在I/O重定向解释之前被设置。文件描述符例如1和2是对打开文件描述符的引用。操作2>&1
使文件描述符2(即stderr)引用与文件描述符1(即stdout)当前引用的相同打开文件描述符(请参见dup2()
和open()
)。然后,操作>/dev/null
更改文件描述符1,使其引用/dev/null
的打开文件描述符,但这并不改变文件描述符2所引用的打开文件描述符,它仍然指向原来指向的文件描述符1的打开文件描述符-即管道。