为什么默认情况下 grep 不从 find 命令中删除终端输出行?

MJH*_*JHd 0 shell grep bash pipe find

我经常对这个简单的命令感到沮丧:

find / | fgrep somestuff.ext
Run Code Online (Sandbox Code Playgroud)

当我不使用时sudo,我会得到一行又一行的拒绝权限——这很公平,但是当 grep 从管道读取它时,为什么没有忽略这个输出?

为什么这种形式的输出直接发送到终端窗口而不是传递到管道中(我怀疑必须发生这种情况)并随后被 grep 忽略,而 cat 生成的相同行(比如我有权限被拒绝的消息存储在文本中)文件)会正确进入管道并被我的 grep 模式忽略?

我觉得这里有一些关于 STDIN/STDOUT 过程的东西我不明白

cho*_*oba 6

权限被拒绝的消息不会发送到标准输出,find而是发送到标准错误。您可以将整个 stderr 重定向到位存储桶:

find 2>/dev/null | fgrep somestuff.ext
Run Code Online (Sandbox Code Playgroud)

此外,要找到给定的文件,您不需要任何 grepping:

find . -name somestuff.ext
Run Code Online (Sandbox Code Playgroud)

您仍然可以将2>/dev/null.

要仅抑制权限被拒绝的消息,您可以使用

2> >(grep -v 'Permission denied' >&2)
Run Code Online (Sandbox Code Playgroud)

在 bash 中。