有沒有辦法在不停止管道中其他程序的情況下退出“更少”跟隨模式?
很多時候,我發現自己需要將輸出放在具有所有功能(滾動、搜尋、快捷方式等)的緩衝區中,並且我已經習慣了
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
不正確嗎?有沒有其他程序可以滿足我的要求?是否可以從此模式“解鎖”?謝謝!
在查看附加到的文件時對我來說可以,但當輸入來自管道時(使用
F
命令 - control-C 可以正常工作)。請參閱使用 less 跟踪管道中的討論?- 這是
less
.
沒有^C有沒有辦法退出“少”跟隨模式?
是的,從
CTRL
版本 569 開始,可以使用+退出跟隨模式,X
這不會停止管道中的其他程序。對於 less 的早期版本(僅支持
CTRL
+C
),可以安排一些事情,以便在按下CTRL
+時發送的 SIGINT 信號C
不會影響管道中的其他程序,從而允許它們繼續執行。這可以通過執行以下任何操作來實現:
- 通過使用setsid實用程序將這些程序移動到單獨的程序組來防止 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
在單獨的終端中使用命令。