如何将 stderr 重定向而不重定向 stdout?

9 浏览
0 Comments

如何将 stderr 重定向而不重定向 stdout?

我有一个程序,它将信息写入stdoutstderr,我需要使用grep处理stderr,把stdout排除在外。

使用一个临时文件,可以分为两步完成:

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

但是如何在不使用临时文件的情况下,使用一条命令和管道实现呢?

admin 更改状态以发布 2023年5月24日
0
0 Comments

或者交换标准错误和标准输出的内容,请使用:

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

这将创建一个新的文件描述符(3)并将其分配给与1(标准输出)相同的位置,然后将fd 1(标准输出)分配给与fd 2(标准错误)相同的位置,最后将fd 2(标准错误)分配给与fd 3(标准输出)相同的位置。

标准错误现在作为标准输出可用,并且旧的标准输出保存在标准错误中。这可能有点过度,但希望它能提供更多有关Bash文件描述符的详细信息(每个进程有九个可用的描述符)。

0
0 Comments

首先将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的打开文件描述符-即管道。

0