less 可以跟随(通过按 F)管道输入(类似于文件)吗?对于正在写入的文件,该命令
less <file>
按 F 时将跟随文件。
但是如果我有一个命令将输出直接输送到 less 中,就像这样
command | less
按 F 不会执行任何操作。
所以看起来管道不能像文件一样跟随?或者也许它与命令也写入 STDERR 有关?我试图实现的效果是始终看到命令的最新输出:就像按住 PageDown 一样!
相关评论适用于 G(转到结束):当直接通过管道传输到 less 时,它将不起作用。
答案1
按F或G尝试less
到达输入 EOF。如果输入是管道,less
则挂起直到管道在另一侧关闭(而不是“不执行任何操作”)。
可以通过将命令输出保存到后台的临时文件中,然后将其用作以下命令的输入来解决此问题less
:
command > /tmp/x &
less +F /tmp/x; kill %; rm /tmp/x
没有选项可以less
仅执行此操作;不过,我承认这会有用。
答案2
less 可以跟随(通过按 F)管道输入(类似于文件)吗?
是的,从版本 474 开始。
有关的:有没有办法退出“less”跟随模式而不停止管道中的其他进程?
作为参考,F 不适用于管道的问题在已知问题列表中的参考号为 300虫子并且标题为F 命令不适用于管道输入。
相关评论适用于 G(转到结束):当直接通过管道传输到 less 时,它将不起作用。
它从版本 466 开始工作。引用自发行说明对于这个版本:
新命令 ESC-G 转到管道中当前缓冲数据的末尾
答案3
来自 less 手册页
[Keyboard] COMMANDS [...]
F Scroll forward, and keep trying to read when the end of file is reached. Normally this command would be used when already
at the end of the file. It is a way to monitor the tail of a file which is growing while it is being viewed. (The behav‐
ior is similar to the "tail -f" command.)
所以这应该有效,而且它实际上对我有效。
答案4
对于旧版本less
(许多发行版仍然没有默认 v581 或更高版本),您可以F在管道上使用 -key(“Follow”),less
就好像您通过使用此单行代码直接对文件执行较少的操作一样(没有tmp 文件):
问题是按ctrl+c会向管道中的所有命令发送 SIGINT,不仅中止您的less
-follow,还中止您的生成命令。为了解决这个问题,我通常将生成命令放在子 shell 中并在那里捕获 SIGINT。像这样:
(trap '' SIGINT; command) | less
括号为您提供了一个子 shell,并且trap
使用空命令''
是一个特殊的调用,它完全丢弃该子 shell 中的信号,而不将其传播到当前正在执行的命令。 SIGINT 是ctrl+c信号。现在您可以点击ctrl+c并且只会less
收到它,让您less
在管道上使用就像在日志文件或其他不断增长的文件上一样。一旦退出less
(通过按q),管道就会被破坏,并且生成命令会发送一个 SIGPIPE,这几乎总是与发送一个 SIGINT 具有相同的效果,但没有trap
设置为捕获它。
v581 及更高版本的较新版本less
允许您使用ctrl+x代替ctrl+c来中止follow
命令 ( F-key)。