Bash clear 命令奇怪的行为会删除回滚缓冲区。

Bash clear 命令奇怪的行为会删除回滚缓冲区。

每当我在终端中运行clear时,它都会删除从屏幕顶部到当前行的回滚缓冲区。我在xterm、st、urxvt都试过了,问题依旧。有什么方法可以改变清除的行为,使其不接触回滚缓冲区?

答案1

“从屏幕顶部到当前行”的注释是不明确的。如果你的意思是从顶部可见部分屏幕上的那不是回滚。终端的回滚是您只能通过使用滚动条(或合适的键,例如shift pageup)才能看到的部分。

XTerm 控制序列记录相关的转义序列:

CSI Ps J  Erase in Display (ED).
            Ps = 0  -> Erase Below (default).
            Ps = 1  -> Erase Above.
            Ps = 2  -> Erase All.
            Ps = 3  -> Erase Saved Lines (xterm).

终端描述能力clear使用倒数第二个,例如,

clear=\E[H\E[2J

将光标定位到左上角,然后清除整个(可见)屏幕。你可以使用擦除下方,但终端描述中未使用它。

参考清除回滚:这是一个特定于终端的功能,最初是 xterm 中的转义序列(1999年,记录在ctlseqs.ms但在更改中没有提及)和后来的(2011年)作为 Linux 控制台的扩展和相应的终端描述来实现。终端数据库将其列为“杂项扩展”

目前,这些终端描述具有以下特点:

是否在类似 xterm 的 VTE 中受支持必须通过测试来回答(VTE 或 Konsole 没有有用的文档)。

如果您不想使用扩展程序,可以删除E3您使用的终端描述中的功能,例如,

infocmp -1x >foo
edit foo, removing the line with "E3="
tic -x foo

我建议使用选项-1-x简化格式并显示要更改的功能。中给出的示例https://ghostbin.com/paste/kfsbj与该建议一致:

  • /home/flowerpick/.terminfo/x/xtermncurses 将使用路径名
  • 功能AXXT是扩展功能(如E3),与选项一起显示-x

如果您使用多种终端类型,则必须对每种终端类型( 的值$TERM)执行此操作,并且更改仅适用于运行 的计算机clear。输出的前几行infocmp显示您正在处理哪一个:

#   Reconstructed via infocmp from file: /home/flowerpick/.terminfo/x/xterm
xterm|xterm terminal emulator (X Window System),

例如,uxrvt设置$TERM为类似 的内容rxvt-unicode,在 中生成如下行infocmp

#       Reconstructed via infocmp from file: /lib/terminfo/r/rxvt-unicode       
rxvt-unicode|rxvt-unicode terminal (X Window System),

st程序使用xterm(或可能xterm-256color),尽管我已经有一段时间没有看到该程序的副本了效果很好,值得评论。

顺便说一下,你可以有一个别名,用于clear发送给定的转义序列(忽略终端描述),但我还没有看到任何人报告这一点。

如果您想“清除上面”,这并不像输入“clear”那么简单。转义符\033[1J会从左上角擦除到当前光标位置。您可以制作一个执行此操作的脚本,以仅清除线在当前光标上方:

  • 使用光标位置报告查找光标当前所在的行/列,以及
  • 如果光标不在第一行(保存该位置),则将光标向上移动一行,然后(按照顺序hpa)移动正确的大量的,
  • 发出“上面清楚”,并且
  • cup使用(光标寻址)返回到原始位置。

带有光标位置报告的部分似乎不适用于(例如)readline 绑定,所以我建议了一个脚本。如果不存在位于第一行的问题,您可以创建使用保存/恢复游标功能的绑定。

答案2

.bashrc我遇到了同样的问题并在帮助中添加了别名:

alias clear='printf "\E[H\E[2J"'

提醒:更改将.bashrc在您打开新终端后生效!

答案3

我经常使用clear命令提示符移动到屏幕顶部并无意中擦除回滚缓冲区,其中通常包含重要内容,例如先前操作中的有用错误消息。

检查手册页,它明确指出:

如果可能的话,clear 会清除屏幕,包括其回滚缓冲区(如果定义了扩展的“E3”功能)。

那里还有一个选项:

-x 不尝试使用扩展的“E3”功能清除终端的回滚缓冲区。

从那时起,我将其添加到 ~/.bashrc 中的别名列表中:

alias clear='clear -x'

当我运行时,我仍然收到移至顶部的提示clear,但现在如果需要,我可以进一步向上滚动。

答案4

我的解决方案是将以下别名添加到我的.bashrc

alias clear='tput reset'

如果想要使用原始行为,例如从回滚缓冲区中清除敏感信息,可以通过在前面添加反斜杠来轻松调用非别名版本,\如下所示这里或者这里。那看起来像这样

\clear

相关内容