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

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

我有以下命令:

find / -name libGL.so.1

它返回许多带有“权限被拒绝”的行。我想排除这些行,所以我添加了以下内容:

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

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

答案1

这无关grep- 这是因为管道|重定向标准输出流stdout,而Permission 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 手册页,您可能会注意到以下简介:

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

因此,如果您想连接 STDERR 和 STDOUT,也可以使用此构造:

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

答案2

你的命令应该是:

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

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

答案3

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

您可以完全重定向 stderr

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

答案4

您是否尝试过使用以下命令调用命令须藤

sudo find / -name libGL.so.1

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

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

更多想法这里, 祝你好运!

相关内容