我有以下命令:
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
更多想法这里, 祝你好运!