答案1
这里要注意的重要一点是问题的标签。此行为特定于 GNOME 终端和基于 libvte 构建的任何其他终端模拟器。您不会在 Xterm、Unicode RXVT、Linux 内核内置的终端仿真器或 FreeBSD 控制台中看到这一点。
一般发生的情况是这样的。
- 该
clear
命令查看 terminfo/termcap 并发出适当的控制序列。- 如果 terminfo/termcap 条目具有
E3
此功能,它会首先写出该功能。这会发出控制序列来清除回滚缓冲区。这及其背后的历史详细记录在clear
该命令的 Dickey ncurses 手册页。 - 然后它使用
clear
清除可见屏幕的功能。
- 如果 terminfo/termcap 条目具有
- terminfo/termcap条目中的控制序列由终端类型决定;但是,除了使用 FormFeed 清除屏幕的终端(现在很少见)(DEC VT 及其模仿者不这样做)之外,它们要么只是普通的旧 ECMA-48 控制序列,要么是其扩展。举些例子:
- 入口
putty
定义E3=\E[3J
Xterm 扩展控制序列。 - NetBSD 控制台的
pcvtxx
入口clear=\E[H\E[J
是许多定义或类似内容之一。这是两个普通的 ECMA-48 控制序列。
- 入口
- 终端仿真器根据控制序列进行操作。根据 ECMA-48 及其 Xterm 扩展的定义:
- CSI
H
(CUP) 使光标归位。 - CSI
0
J
(ED 0) 或仅 CSIJ
从当前光标位置擦除到屏幕末尾。 - CSI
2
J
(ED 2) 擦除整个屏幕。 - CSI
3
J
(ED 3) 擦除回滚缓冲区。
- CSI
特别是对于 GNOME 终端:
- 终端类型是正确的
gnome
,但有些人错误地将其设置为xterm
。 - terminfo
gnome
条目没有定义E3
功能,并且在许多系统上仍然如此! - 该条目也没有,xterm
因为这还没有从迪基术语信息。所以clear
只写出clear
能力的内容。 - 这些 terminfo 条目的功能内容
clear
是使光标归位然后擦除整个屏幕的控制序列。 - 但 GNOME 终端无法正确执行擦除整个屏幕。 更具体地说,它所基于的库 libvte 在代码中没有这样做它的
VteTerminalPrivate::seq_clear_screen()
功能。相反,libvte 将屏幕向下滚动整个屏幕的空白行,并将光标位置移动到这些空白行中的第一行。
这就是为什么你会看到你所看到的。当被告知时,libvte 不会擦除整个屏幕。相反,它正在做一些表面上与此相似的事情,直到有人完全按照提问者在这里所做的那样:向后滚动终端窗口以查看向后滚动缓冲区。那么差别就很明显了。
在其他终端仿真器(例如 Xterm 和 Unicode RXVT)上,ED 2 控制序列确实会擦除屏幕,从上到下擦除屏幕上的每个位置,并且不会更改回滚缓冲区。但在 libvte 终端模拟器上,它只是将当前屏幕推入回滚缓冲区并添加一个屏幕的空白行。先前的屏幕内容不会被删除,而是移入回滚缓冲区。
如果您运行该clear
命令两次,它会添加二屏幕上的空白行。如果你的回滚缓冲区足够大,你可以仍然找到原始屏幕内容,只需在回滚缓冲区中进一步查找即可。
进一步阅读
- 编码字符集的控制函数ECMA-48。1976 年。
- 格奥尔基·基里洛夫 (2007-12-30)。Ctrl-L 将空白区域添加到回滚缓冲区。 GNOME 错误#506438。
- xterm、xterm-color 和 linux 终端模拟器在多大程度上基于 VT100?
- 清除“旧”回滚缓冲区
- Bash clear 命令奇怪的行为会删除回滚缓冲区。
- https://superuser.com/questions/1094599/
- 托马斯·迪基 (2018)。 ”XTerm 和类似程序中的已知错误:GNOME 终端”。 XTerm 常见问题解答。隐形岛.net。
- 托马斯·迪基 (2018)。 ”XTerm 和 Look-alikes 中的已知错误:VTE 注释”。 XTerm 常见问题解答。隐形岛.net。
答案2
如果您想清除终端并销毁整个输出缓冲区,我建议您这样做tput reset
。如果例如任何先前的程序崩溃并使终端处于不干净的状态,这肯定会清除终端并修复其状态作为奖励。此外,它tput
应该足够聪明,能够确定正确的终端类型,因此您不需要知道您的终端是否使用 VT100 或其他命令序列。
正如tput reset
POSIX 所定义的,它也应该在任何 POSIX 兼容系统中工作:https://pubs.opengroup.org/onlinepubs/007904975/utilities/tput.html