进一步阅读

进一步阅读

当我使用clear命令清除屏幕时。它没有被清除(当命令完成后我向上滚动一点时请参见屏幕截图)

在此输入图像描述

因此,我将命令加倍以获得正确的行为:

$ clear && clear && DD=0 ...

在此输入图像描述

为什么我需要双倍命令才能清除屏幕?

UPD

实际上,如果我只是clear清除屏幕。但我可以向上滚动并查看最后 25 行(如果屏幕为 80x25)。当我跑步时,clear;clear我把这些线清除了。

答案1

这里要注意的重要一点是问题的标签。此行为特定于 GNOME 终端和基于 libvte 构建的任何其他终端模拟器。您不会在 Xterm、Unicode RXVT、Linux 内核内置的终端仿真器或 FreeBSD 控制台中看到这一点。

一般发生的情况是这样的。

  1. clear命令查看 terminfo/termcap 并发出适当的控制序列。
    1. 如果 terminfo/termcap 条目具有E3此功能,它会首先写出该功能。这会发出控制序列来清除回滚缓冲区。这及其背后的历史详细记录在clear该命令的 Dickey ncurses 手册页
    2. 然后它使用clear清除可见屏幕的功能。
  2. terminfo/termcap条目中的控制序列由终端类型决定;但是,除了使用 FormFeed 清除屏幕的终端(现在很少见)(DEC VT 及其模仿者不这样做)之外,它们要么只是普通的旧 ECMA-48 控制序列,要么是其扩展。举些例子:
  3. 终端仿真器根据控制序列进行操作。根据 ECMA-48 及其 Xterm 扩展的定义:
    • CSI H(CUP) 使光标归位。
    • CSI 0 J(ED 0) 或仅 CSIJ从当前光标位置擦除到屏幕末尾。
    • CSI 2 J(ED 2) 擦除整个屏幕。
    • CSI 3 J(ED 3) 擦除回滚缓冲区。

特别是对于 GNOME 终端:

  1. 终端类型是正确的gnome,但有些人错误地将其设置为xterm
  2. terminfognome条目没有定义E3功能,并且在许多系统上仍然如此! - 该条目也没有,xterm因为这还没有从迪基术语信息。所以clear只写出clear能力的内容。
  3. 这些 terminfo 条目的功能内容clear是使光标归位然后擦除整个屏幕的控制序列。
  4. 但 GNOME 终端无法正确执行擦除整个屏幕。 更具体地说,它所基于的库 libvte 在代码中没有这样做它的VteTerminalPrivate::seq_clear_screen()功能。相反,libvte 将屏幕向下滚动整个屏幕的空白行,并将光标位置移动到这些空白行中的第一行。

这就是为什么你会看到你所看到的。当被告知时,libvte 不会擦除整个屏幕。相反,它正在做一些表面上与此相似的事情,直到有人完全按照提问者在这里所做的那样:向后滚动终端窗口以查看向后滚动缓冲区。那么差别就很明显了。

在其他终端仿真器(例如 Xterm 和 Unicode RXVT)上,ED 2 控制序列确实会擦除屏幕,从上到下擦除屏幕上的每个位置,并且不会更改回滚缓冲区。但在 libvte 终端模拟器上,它只是将当前屏幕推入回滚缓冲区并添加一个屏幕的空白行。先前的屏幕内容不会被删除,而是移入回滚缓冲区。

如果您运行该clear命令两次,它会添加屏幕上的空白行。如果你的回滚缓冲区足够大,你可以仍然找到原始屏幕内容,只需在回滚缓冲区中进一步查找即可。

进一步阅读

答案2

如果您想清除终端并销毁整个输出缓冲区,我建议您这样做tput reset。如果例如任何先前的程序崩溃并使终端处于不干净的状态,这肯定会清除终端并修复其状态作为奖励。此外,它tput应该足够聪明,能够确定正确的终端类型,因此您不需要知道您的终端是否使用 VT100 或其他命令序列。

正如tput resetPOSIX 所定义的,它也应该在任何 POSIX 兼容系统中工作:https://pubs.opengroup.org/onlinepubs/007904975/utilities/tput.html

相关内容