我有一个将信息写入stdout
和stderr
的程序,我需要用grep
处理stderr
code>,将 stdout
放在一边。
使用临时文件,可以分两步完成:
command > /dev/null 2> temp.file
grep 'something' temp.file
但是如果没有临时文件,如何使用一个命令和管道实现这一点呢?
最佳答案
首先将 stderr 重定向到 stdout——管道;然后将 stdout 重定向到 /dev/null
(不改变 stderr 的去向):
command 2>&1 >/dev/null | grep 'something'
有关各种 I/O 重定向的详细信息,请参阅关于 Redirections 的章节在 Bash 引用手册中。
请注意,I/O 重定向的顺序是从左到右解释的,但是管道是在解释 I/O 重定向之前设置的。诸如 1 和 2 之类的文件描述符是对打开文件描述的引用。 2>&1
操作使文件描述符 2 aka stderr 引用与文件描述符 1 aka stdout 当前引用的相同的打开文件描述(参见 dup2()
和 open()
)。 >/dev/null
操作随后更改文件描述符 1,使其指向 /dev/null
的打开文件描述,但这并没有改变以下事实文件描述符 2 指的是文件描述符 1 最初指向的打开文件描述——即管道。
关于bash - 我如何通过管道传输 stderr 而不是 stdout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2342826/