Eug*_*kov 4 terminal gnome-terminal
当我使用clear
命令清除屏幕时。它没有被清除(当我在命令完成后向上滚动一点时查看屏幕截图)
所以我将命令加倍以获得正确的行为:
$ clear && clear && DD=0 ...
Run Code Online (Sandbox Code Playgroud)
为什么我需要将命令加倍才能清除屏幕?
UPD
实际上,如果我只是clear
清除了屏幕。但我可以向上滚动并查看最后 25 行(如果屏幕为 80x25)。当我跑步时,clear;clear
我清除了这些线条。
Jde*_*eBP 11
这里要注意的重要一点是问题上的标签。此行为特定于 GNOME 终端和任何其他基于 libvte 构建的终端模拟器。您不会在 Xterm、Unicode RXVT、Linux 内核内置的终端模拟器或 FreeBSD 控制台中看到这一点。
一般发生的事情是这样的。
clear
命令查看 terminfo/termcap 并发出适当的控制序列。
E3
它的能力,它首先将其写出。这会发出控制序列以清除回滚缓冲区。这和背后还有中详细记录了历史的迪基的ncurses手册页的clear
命令。clear
清除可见屏幕的功能。putty
条目定义E3=\E[3J
了 Xterm 扩展控制序列。pcvtxx
条目是许多定义clear=\E[H\E[J
或类似内容的条目之一。这是两个普通的 ECMA-48 控制序列。H
(CUP) 放置光标。0
J
(ED 0) 或仅 CSIJ
从当前光标位置擦除到屏幕末尾。2
J
(ED 2) 擦除整个屏幕。3
J
(ED 3) 擦除回滚缓冲区。特别是在 GNOME 终端方面:
gnome
,但有些人错误地将其设置为xterm
.gnome
terminfo项没有定义的E3
能力,并在许多系统-依旧!-xterm
条目也没有,因为它没有从Dickey terminfo渗透下来。所以clear
只写出clear
能力的内容。clear
这些 terminfo 条目的功能内容是将光标归位然后擦除整个屏幕的控制序列。VteTerminalPrivate::seq_clear_screen()
函数代码中没有这样做。相反,libvte 将屏幕向下滚动整个屏幕的空白行,并将光标位置移动到这些空白行中的第一个。这就是为什么你会看到你所看到的。当被告知时,libvte 不会擦除整个屏幕。相反,它正在做一些与此表面相似的事情,直到人们完全按照提问者在这里所做的事情进行:将终端窗口向后滚动以查看回滚缓冲区。那么差别就很明显了。
在 Xterm 和 Unicode RXVT 等其他终端仿真器上,ED 2 控制序列确实会擦除屏幕,从上到下擦除屏幕上的每个位置,并且不会改变回滚缓冲区。但是在 libvte 终端模拟器上,它只是将当前屏幕推入回滚缓冲区并添加一个屏幕的空白行。先前的屏幕内容不会被擦除,而是被转移到回滚缓冲区中。
如果您运行该clear
命令两次,它会添加两个屏幕的空白行。如果您的回滚缓冲区足够大,您仍然可以找到原始屏幕内容,只需在回滚缓冲区中进一步向上即可。