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 过程的东西我不明白
权限被拒绝的消息不会发送到标准输出,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 中。