bash - 我如何通过管道传输 stderr 而不是 stdout?

标签 bash grep stdout pipe stderr

我有一个将信息写入stdoutstderr 的程序,我需要用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/

相关文章:

bash - 带for循环的远程SSH命令

regex - 使用 Bash 正则表达式匹配 (=~),其中正则表达式包含引号(“字符”)

bash - 自定义 bash 完成输出 : each suggestion on a new line

regex - 查找目录中具有特定单词的 xml 文件的数量

python - “命令”对象没有属性 'stdout'

c++ - 检查哪些输出写入了标准输出

php - Shell 脚本 "read"函数 - 不是有效的标识符

linux - 在多个语料库上 Grep 多个关键字的快速方法

python - 根据文件名列表打印目录中文件的一些行

c - 根据程序的标准输出将二进制数据传递到程序的标准输入