查找到 less 的管道 - 为什么当我按“向上”键时只留下正确的行?

查找到 less 的管道 - 为什么当我按“向上”键时只留下正确的行?

我偶然发现了一个过滤有用行的好方法find:只需将其通过管道传输到底部less,当它显示(END)在底部时,按up箭头键,只留下正确的行。不Permission denied,没有符号链接错误,没有别的。

find / -name foo | less

但为什么?无法找到有关此行为原因的答案。less神奇地过滤掉非结果行?

答案1

find没有“action”的应用其默认-print操作,将完整文件名输出到标准输出。错误转到标准错误。

管道运算符仅重定向标准输出;因此,只有“正确”的文件名会发送到less,其他所有内容都会发送到标准错误,即您的终端。less 写入您的终端,因此您最初会在屏幕上看到文件名和错误;但是当您向上滚动less(或调用导致其更新屏幕的任何其他操作)时,错误将被less的更新覆盖,因为它只知道从的标准输出less中看到的输入。find

要翻阅 中的完整输出less,您还需要重定向标准错误:

find / -name foo 2>&1 | less

要完全忽略错误,请将其重定向到位存储桶:

find / -name foo 2>/dev/null | less

答案2

这与它本身无关less。只是有两个输出流:标准输出(stdout)和标准错误(stderr)。正如您所期望的,错误消息将转到stderr,而常规输出将转到stdout。默认情况下,管道仅捕获stdout并忽略stderr.由于 find 的错误位于 中stderr,因此这些错误不会发送到less,这就是为什么它看起来像是less过滤掉错误的原因。

相关内容