「Linux / Shell」- 当退出“man”手册后,在屏幕上保留查看的内容

问题描述

当我们执行终端全屏的命令后,在退出时,终端的内容会被清空。比如man find,按“q”退出时,回到我们执行命令之前的状态,而不会在终端上保留执行man find命令产生的输出;

有时这并不方便。因为我们也许需要参照手册的提示内容,来键入后面的命令。因此需要保留命令在终端上的产生的输出;

本文的主要内容就是讨论如何在终端里保留全屏命令产生的输出;

原因分析

为什么屏幕的内容会被“清空”?

实际上并不是”清空“,这种行为来自某些(硬件)终端和大多数(软件)终端仿真器中提供的“备用屏幕(Alternate Screen)”功能。这会发生什么事情是一些“终端感知程序”切换到“备用屏幕”来完成他们的工作,并在他们被退出(或暂停等等)时切换回“正常屏幕”。这有效地清除了这些程序的最终输出,所以看起来像是被清空了;

因此入手点有两个:

  • 禁止程序使用“备用屏幕”。这通过设置特定程序实现;
  • 关闭“备用屏幕”功能。这通过设置终端程序实现;

下面将按照这两方面进行介绍;

通过设置特定程序实现

文章「Exorcising the Evil Alternate Screen」讨论了“备用屏幕”的问题,并提出了几个解决办法;

某些程序通过配置可以禁用“备用屏幕”:

  • 命令 less(1)可以使用-X 选项,或者通过它支持的 LESS 环境变量;
  • 命令 vim(1)可以通过取消 t_ti 和 t_te 变量;
  • 关于 GNOME Terminal 参考「Stop gnome-terminal screen clear」一文;
  • 终端复用程序 screen 可以使用altscreen off配置选项。而 tmux 可以在配置文件中添加set -g alternate-screen off配置行;

有关的详细内容和配置细节请参考对应的手册;

解决方案

通过设置终端程序实现

本部分旨在提用一个在 XTerm 中相对通用的方法,而不是去配置具体的程序来实现“禁用备用屏幕”;

方法一、配置 XTerm 控制序列

本部分参考「Is there any way to exit “less” without clearing the screen?」、「How can I still see the ‘man’ text after I quit man?」文章;

方法二、修改 .Xresource 文件

在$HOME/.Xresources 文件中加入:

XTerm*titleInhibit: true

然后,执行:xrdb $HOME/.Xresources命令;

参考文献

Is there any way to exit “less” without clearing the screen?
有没有办法退出“less”而不清除屏幕?
Xterm Control Sequences

更新日志

07/30/2017 创建文章;
08/07/2018 完善文章内容;