控制台/外壳缓存/还原如何工作?



这个问题纯粹是出于好奇;没有问题需要解决。

注意:我在 CentOS 7 上使用 Konsole 。

当我通过 SSH 连接到远程盒子并使会话处于非活动状态一段时间时,它会超时。作为一种解决方法,我使用less [some-file]来保持会话处于活动状态。

显然,当我在一天结束时挂起 VM 时,会话仍然会中断。

第二天,当我开始一个新的SSH会话时,一切都很正常,除了一些Console功能不起作用(即清除回滚,我经常使用(用于SSH会话的同一终端窗口。

但是,在我less文件并退出后,会发生两件事:

  1. 孔索尔恢复正常工作。
  2. 在我使用之前终端中的任何输出less都会替换为前一天的任何输出,在会话因关闭我正在 SSH 操作的虚拟机而中断之前。

奇怪的是,所有 ~4 个并发终端/会话都会发生这种情况(每个终端/会话都恢复了前一天的输出(。[编辑:澄清:当 I SSH/less 在该特定终端中时,~4 个终端中的每一个都表现出这种行为。每个都从前一天恢复其输出。在一个终端/会话中执行此操作不会影响其他终端/会话]

我认为任何具有自己的"gui"的终端应用程序(例如 vi、nano 等(都会发生这种情况,并且不特定于less

似乎有一些缓存正在进行。我假设退出less(或 vi、nano 等(通常会触发某种 shell 输出恢复,但这种特殊表现似乎有些奇怪。

知道发生了什么吗?

问题中描述的终端功能替代屏幕功能(最初xterm,但被包括konsole在内的其他几个终端复制/模仿(。 根据终端描述,您可能/可能不会使用此功能。

less和大多数全屏终端程序(如vi发送转义序列以切换到备用屏幕,前提是它们在终端描述中定义(即TERM=xterm(。

从描述中可以看出,听起来好像您在同一个konsole实例中使用不同的选项卡,并且它记得您的终端已设置为备用屏幕。konsole和其他一些程序在停止时尝试保存/恢复"会话"信息,因此保存/恢复似乎是一件好事。

在备用屏幕中,终端程序通常很少或无法访问回滚区域。

您可以使用tput发送相同的转义序列(无需运行less(:

tput rmcup

(如果终端描述没有对此的定义,它将不执行任何操作(。

延伸阅读:

  • 为什么运行vi时屏幕不清晰?

最新更新