为什么grep在这里使用管道不起作用?


18

我有以下命令:

find / -name libGL.so.1

它返回很多行与“权限被拒绝”。我想排除这些行,因此添加了以下内容:

find / -name libGL.so.1 | grep -v 'denied'

但是输出是相同的-我grep -v 'denied'没有用过滤掉行Permission denied。我尝试了许多变体,查看了grep教程,但无法弄清楚问题所在。有什么建议么?

Answers:


43

这无关紧要grep-因为管道|重定向标准输出流,stdoutPermission denied消息在标准错误流中stderr。你可以达到你想要使用结合流的结果2>&1(重定向其文件描述符是流2给其文件描述符是流1),以便stderr以及stdout被输送到grep命令的输入

find / -name libGL.so.1 2>&1 | grep -v 'denied'

但通常stderr将其重定向到/dev/null

find / -name libGL.so.1 2>/dev/null

使用|&代替2>&1 |

如果查看Bash手册页,您可能会注意到以下内容:

如果|&使用,则命令的标准错误通过管道连接到command2的标准输入。它是的简写2>&1 |

因此,如果要加入STDERR和STDOUT,也可以使用此构造:

find / -name libGL.so.1 |& grep -v 'denied'

3
如果理由很奇怪的文件存在于:在组合它们补充说明/foo/bar/denied/libGL.so.1,结合stdoutstderr 过滤会隐藏结果
Izkata

5

您的命令应为:

find / -name libGL.so.1 2>/dev/null

Find抱怨标准错误(fd2)的权限。为了消除这些行,将(>)standard重定向到位存储桶(/ dev / null)。


4

“拒绝权限”行将进入stderr(标准错误)流,但是您正在通过grep传递stdout(标准输出)。

您可以使用以下命令完全重定向stderr

find / -name libGL.so.1 2> /dev/null

2

您是否尝试过使用sudo调用命令?

sudo find / -name libGL.so.1

如果仍然显示该消息,请使用已经提到的stderr(fd = 2)重定向到必杀技(/ dev / null)

sudo find / -name libGL.so.1 2> /dev/null

这里有更多想法,祝您好运!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.