Shell

有沒有辦法在不停止管道中其他程序的情況下退出“更少”跟隨模式?

  • February 4, 2022

很多時候,我發現自己需要將輸出放在具有所有功能(滾動、搜尋、快捷方式等)的緩衝區中,並且我已經習慣了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在單獨的終端中使用命令。

引用自:https://unix.stackexchange.com/questions/197199