有没有办法退出“less”跟随模式而不停止管道中的其他进程?

有没有办法退出“less”跟随模式而不停止管道中的其他进程?

很多时候,我发现自己需要将输出保存在具有所有功能(滚动、搜索、快捷方式……)的缓冲区中,并且我已经习惯了less.

但是,我使用的大多数命令都会连续生成输出。使用less连续输出并没有真正按照我预期的方式工作。

例如:

while sleep 0.5
do
    echo "$(cat /dev/urandom | tr -cd 'a-zA-Z0-9' | head -c 100)"
done | less -R

这会导致less捕获输出,直到它达到最大终端高度,此时一切都停止(希望仍然接受数据),允许我使用移动键上下滚动。这就是想要的效果。

奇怪的是,当我赶上生成的内容(通常使用PgDn)时,它会导致less锁定并跟踪新数据,不允许我使用移动键,直到我终止^C并停止原始命令。这不是想要的效果。

难道是我使用方式less不对?还有其他程序可以实现我的愿望吗?是否可以从该模式“解锁”?

谢谢你!

答案1

有没有办法在不使用 ^C 的情况下退出“less”跟随模式?

是的,开始从版本 569 开始,可以使用CTRL+退出跟随模式X,这不会停止管道中的其他进程。

对于 less 的早期版本(仅支持CTRL+ ),可以安排一些事情,以便在按+C时发送的 SIGINT 信号不会影响管道中的其他进程,从而允许它们继续运行。这可以通过执行以下任一操作来实现:CTRLC

  • 通过使用以下命令将这些进程移动到单独的进程组中,防止 SIGINT 到达管道中的其他进程设定值公用事业:

(setsid seq 10000000) | less +F

  • 处理(捕捉) SIGINT,以便它不会传递到管道中的其他进程:

(trap '' INT; seq 10000000) | less +F

  • 使用进程替换(非 POSIX 功能,在 Bash、Zsh 和 Ksh 中实现,但在 Dash 等中未实现):

less -f +F <(seq 10000000)

(seq 10000000 &) | less +F

为了观察上述命令对进程组和信号处理的影响,我建议ps -O ppid,pgrp,sid,ignored --forest -C bash,less,seq在单独的终端中使用命令。

答案2

当查看要附加的文件时,对我来说工作正常,但当输入来自管道时则不行(使用命令F- control-C 工作正常)。

参见讨论跟随管道使用更少?- 这是一个已知的错误/缺点less

答案3

( your_input_pipeline & ) | less +F

{ your_input_pipeline & } | less +F

似乎在 Bash 中工作。它也适用于 Zsh 和 Dash,只不过 INT 信号在less退出后传播到封闭的 shell 。在 Ksh 中不起作用。

测试配置:

GNU bash 5.0.17
dash 0.5.10.2-6 (package version in Ubuntu Linux)
zsh 5.8
less 551

答案4

也许最简单的答案:

trap '' INT
your_input_pipeline | less +F
# you may want to restore or define new INT trap here
echo still in the shell

这还可以防止封闭的 shell 被中断,如果 shell 不是 Bash,则其他答案可能会发生这种情况。

相关内容