很多时候,我发现自己需要将输出保存在具有所有功能(滚动、搜索、快捷方式……)的缓冲区中,并且我已经习惯了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)
- 将进程发送到后台(使用以下事实:shell 在后台进程中忽略 SIGINT 和 SIGQUIT):
(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,则其他答案可能会发生这种情况。