跟随管道使用更少?

跟随管道使用更少?

less 可以跟随(通过按 F)管道输入(类似于文件)吗?对于正在写入的文件,该命令

less <file>

按 F 时将跟随文件。

但是如果我有一个命令将输出直接输送到 less 中,就像这样

command | less

按 F 不会执行任何操作。

所以看起来管道不能像文件一样跟随?或者也许它与命令也写入 STDERR 有关?我试图实现的效果是始终看到命令的最新输出:就像按住 PageDown 一样!

相关评论适用于 G(转到结束):当直接通过管道传输到 less 时,它将不起作用。

答案1

FG尝试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)。

相关内容