我正在使用 cygwin 在 cygdrive 上查找文件。
但是我需要隐藏权限被拒绝的消息(否则结果会隐藏在错误消息中)。以下命令有效:
find -name 'myfile.*' |& grep -v "Permission denied"
我不明白为什么这个命令中需要加上“&”符号,本来以为它会起作用,但结果却不行。
find -name 'myfile.*' | grep -v "Permission denied"
请解释一下“&”符号的含义。
答案1
在类 Unix 系统中,有两个输出路径,如果不进行修改,则会将输出发送到屏幕。标准错误(或 stderr)是捕获大多数故障和错误情况的路径。
要将 stderr 中的权限被拒绝消息传递到与“常规输出”相同的输出流,您必须将两者结合起来。在您的示例中,为了grep -v
正确操作它,您将 stdout(标准输出)和 stderr 与您所看到的神秘语法结合起来。
如果
|&
使用' ',命令1的标准错误,除了它的标准输出外,还连接到命令2通过管道将 的标准输入重定向到 ;它是 的简写2>&1 |
。在命令指定的任何重定向之后,将标准错误隐式重定向到标准输出。
此外,正如 geirha 指出的那样,如果您只想摆脱 stderr 输出,您可能需要执行类似以下操作
find -name 'myfile.*' 2> /dev/null
也许
find -name 'myfile.*' 2> /tmp/errorlog
请注意,如果您有命令字符串,例如find
将其输出传递给,xargs
则需要将整个命令管道放在括号中,以捕获命令所有组件的输出。例如,
(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 ) 2> /dev/null
如果你省略括号,而是这样做——
find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null
您仍然会看到来自 find 或 egrep 的权限被拒绝错误,但 stderr 将被重定向到 xargs。
正如您所见,您可能只会在测试运行期间查看其内容后才会丢弃 stderr。
请注意,对于 GNUfind
以及据我所知任何符合 POSIX 的find
,该-print
选项都是隐式的。如果您愿意,仍然可以显式提供它。
答案2
错误消息写入标准错误, 不是标准输出,但|
仅限管道标准输出。
你可能想要|&
,哪些管道标准错误也标准输出。
答案3
如果您想忽略错误消息,只需将 stderr 重定向到 /dev/null。
find . -name 'myfile.*' -print 2>/dev/null