我偶然找到了一种过滤有用行的好方法find:只需将其通过管道传输到底部,less当它显示(END)在底部时,按up箭头键,只剩下正确的行。不Permission denied,没有符号链接错误,没有别的。
find / -name foo | less
Run Code Online (Sandbox Code Playgroud)
但为什么?找不到关于为什么这种行为的答案。less神奇地过滤掉非结果行?
Ste*_*itt 15
find没有“动作”应用其默认-print动作,将完整的文件名输出到标准输出。错误归入标准错误。
管道操作符只重定向标准输出;所以只有“正确”的文件名被发送到less,其他一切都进入标准错误,这是你的终端。less 还会写入您的终端,因此您最初会在屏幕上看到文件名和错误;但是当您向上滚动less(或调用导致它更新屏幕的任何其他操作)时,错误将被less的更新覆盖,因为less它只知道从find的标准输出看到的输入。
要翻阅 中的完整输出less,您还需要重定向标准错误:
find / -name foo 2>&1 | less
Run Code Online (Sandbox Code Playgroud)
要完全忽略错误,请将其重定向到位桶:
find / -name foo 2>/dev/null | less
Run Code Online (Sandbox Code Playgroud)
ter*_*don 10
这与less自己无关。只是有两个输出流:标准输出(stdout)和标准错误(stderr)。如您所料,错误消息转到stderr,而常规输出转到stdout。默认情况下,管道仅捕获stdout并忽略stderr. 由于 find 的错误在 中stderr,因此这些错误不会发送到less,这就是为什么看起来less正在过滤错误的原因。
| 归档时间: |
|
| 查看次数: |
799 次 |
| 最近记录: |