clear
是 Linux 和 Unix 系统中用于清空终端屏幕的常用命令。它的作用是移除当前终端窗口中的所有可见内容,提供一个干净的界面,类似于“刷新”终端。以下是关于clear
的详细解析:
目录
1. 基本用法
2. 实现原理
3. 常见场景
场景 1:清理屏幕,专注当前任务
场景 2:脚本中的使用
场景 3:替代快捷键
4. 与其他命令的区别
5. 常见问题
Q1: clear 后如何恢复之前的输出?
Q2: 如何真正清空终端历史(包括滚动缓冲区)?
Q3: 为什么 clear 后有些终端显示空白行?
6. 扩展技巧
自定义清屏命令
通过环境变量控制行为
7. 兼容性说明
补充:
1.滚动缓冲区的作用
2. clear 命令与滚动缓冲区
3. 示例:如何查看/控制滚动缓冲区?
(1) 查看终端当前的滚动缓冲区大小
(2) 彻底清屏(包括滚动缓冲区)
(3) 测试滚动缓冲区
4. 不同终端的差异(参考于网上资料)
再补充:关于reset
1. reset 的官方定义
2. 为什么在 Xshell 中 reset 不彻底清空滚动缓冲区?
终端差异:
Xshell 的特殊性:
3. 验证 reset 的实际行为
1. 为什么 \033[3J 和 reset 在 Xshell 中无效?
2. 已验证的解决方案
有效方法:(目前博主用到的方法,若还有其他方法欢迎讨论)
1. 基本用法
直接输入命令:clear
执行后,终端的所有历史输出会被清空,光标移动到屏幕左上角(第一行第一列)。
2. 实现原理
-
本质:
clear
并非真正删除终端的历史记录,而是通过输出特殊的控制字符(ANSI Escape Code)实现“视觉清屏”。-
实际执行的转义序列:
\033[3J\033[H\033[2J
(不同终端可能略有差异)。
-
-
查看实际行为:
# 显示 clear 实际发送的字符(十六进制) echo -e "clear 实际发送(十六进制):\n" && clear | hexdump -C
输出示例:
1. echo -e "clear 实际发送(十六进制):\n"
-
echo
用于输出文本。 -
-e
选项启用转义字符解释,允许\n
被解析为换行符。
2. &&
(逻辑与)
-
表示前一个命令成功执行后,才会执行后面的命令。
-
如果
echo
执行成功,就继续执行clear | hexdump -C
。
3. clear | hexdump -C
clear
命令的作用
-
clear
通常用于清空终端屏幕。 -
它实际上会发送 终端控制序列(ANSI Escape Codes),例如:
-
\033[3J
(清除滚动缓冲区) -
\033[H\033[2J
(移动光标到左上角并清屏)
-
-
但具体发送的字节取决于终端类型(如
xterm
、linux console
等)。
|
(管道)
-
将
clear
的输出(控制字符)传递给hexdump -C
。
hexdump -C
-
hexdump
是一个十六进制查看工具。 -
-C
选项表示以 Canonical(标准)格式 显示:-
左边:每行 16 个字节的十六进制值。
-
右边:对应的 ASCII 字符(不可打印字符显示为
.
)。
-
3. 常见场景
场景 1:清理屏幕,专注当前任务
-
在输入复杂命令前清屏,避免旧输出干扰。
-
演示或教学时逐步展示操作步骤。
场景 2:脚本中的使用
在脚本中清屏并显示新内容:
#!/bin/bash
clear
echo "===== 系统信息 ====="
neofetch # 假设已安装此工具
场景 3:替代快捷键
-
快捷键
Ctrl + L
也实现清屏功能(等效于clear
,但不会清除滚动缓冲区(clear也是))。 -
在终端(Terminal)或控制台(Console)中,滚动缓冲区(Scrollback Buffer) 是指 存储已经滚出屏幕外的历史文本内容的内存区域。它允许用户通过滚动条或快捷键(如
Shift+PageUp/PageDown
) 查看之前显示过的内容,即使这些内容已经不在当前可见的屏幕范围内。(文章末尾会补充相关滚动缓冲区的相关知识)
4. 与其他命令的区别
命令/操作 | 说明 |
---|---|
clear | 清空当前屏幕内容,但滚动缓冲区(可通过鼠标滚轮查看的历史)仍保留。 |
reset | 完全重置终端(包括清屏、修复终端乱码等),但执行速度较慢。 |
printf "\033c" | 快速清屏(类似 clear ),但兼容性可能因终端而异。 |
Ctrl + L | 快捷键实现清屏(效果同 clear )。 |
5. 常见问题
Q1: clear
后如何恢复之前的输出?
-
clear
只是视觉清屏,终端滚动缓冲区仍保留历史。通过鼠标滚轮或终端快捷键(如Shift + PgUp
)可查看。
Q2: 如何真正清空终端历史(包括滚动缓冲区)?
-
使用以下命令(依赖终端类型):
clear && printf '\e[3J' # 大多数终端有效
或:
reset # 完全重置终端(速度慢)
Q3: 为什么 clear
后有些终端显示空白行?
-
部分终端(如 macOS Terminal)会保留一行空白,这是正常行为。
6. 扩展技巧
自定义清屏命令
在 ~/.bashrc
中添加别名,实现快速清屏并显示时间:
alias cls='clear && date "+%Y-%m-%d %H:%M:%S"'
使用:
cls # 清屏后显示当前时间
通过环境变量控制行为
-
某些终端(如
xterm
)支持环境变量调整清屏方式:export TERM=xterm-clear # 修改终端类型(需终端支持)
7. 兼容性说明
-
终端差异:
clear
的行为可能因终端类型(如gnome-terminal
,konsole
,iTerm2
)略有不同。 -
脚本中的可移植性:若需跨平台兼容,建议使用
tput
命令:tput clear # 更标准的清屏方式
补充:
1.滚动缓冲区的作用
-
记录历史输出:当终端内容超过一屏时,旧的内容不会丢失,而是被存入滚动缓冲区。
-
允许回溯查看:用户可以通过滚动或快捷键查看之前执行的命令和程序的输出。
-
不同终端实现不同:
-
例如,
xterm
、GNOME Terminal
、iTerm2
等 GUI 终端通常有较大的滚动缓冲区(可配置,甚至无限滚动)。 -
而 Linux 虚拟控制台(如
tty1
~tty6
)的滚动缓冲区可能较小(默认通常为几屏内容)。
-
2. clear
命令与滚动缓冲区
-
普通
clear
或Ctrl+L
:-
仅清除当前屏幕的内容,但滚动缓冲区仍然保留历史。
-
对应的控制序列:
\033[H\033[2J
(移动光标到左上角并清屏)。
-
-
彻底清除滚动缓冲区:
-
可以使用
clear && printf '\033[3J'
或reset
命令。 -
\033[3J
是 清除滚动缓冲区 的 ANSI 转义码(部分终端支持)。 -
reset
会完全重置终端状态,包括清空缓冲区。(关于reset不能清除滚动缓冲区的问题,最后再补充,先暂时看下去)
-
3. 示例:如何查看/控制滚动缓冲区?
(1) 查看终端当前的滚动缓冲区大小
-
在
xterm
、GNOME Terminal
等 GUI 终端中,可以在首选项里设置:-
例如:
无限滚动
或限制为 10000 行
。
-
-
在 Linux 虚拟终端(如
tty1
)中,缓冲区大小由内核设置,通常较小(如 512 行)。
(2) 彻底清屏(包括滚动缓冲区)
clear && printf '\033[3J' # 清屏 + 清除滚动缓冲区(部分终端支持)
或
reset # 完全重置终端(较慢,但更彻底)
(3) 测试滚动缓冲区
for i in {1..100}; do echo "Line $i"; done
-
运行后,尝试向上滚动,可以看到已经被“清屏”但仍在缓冲区的内容。(后面会说)
4. 不同终端的差异(参考于网上资料)
终端类型 | 默认滚动缓冲区 | 是否支持 \033[3J 清空缓冲区? |
---|---|---|
xterm | 可配置(默认 ~1000 行) | ✅ 支持 |
GNOME Terminal | 可配置(可无限) | ✅ 支持 |
iTerm2 (macOS) | 可配置(可无限) | ✅ 支持 |
Linux 虚拟终端 (tty1 ) | 较小(通常 ~512 行) | ❌ 不支持 |
screen / tmux | 可配置 | ✅ 通常支持 |
再补充:关于reset
1. reset
的官方定义
-
reset
是终端初始化工具(通常是tput reset
或/usr/bin/reset
)。 -
设计目标:修复终端异常状态(如乱码、按键无响应等)。
-
理论上:它会发送完整的终端初始化序列(包括
\033c
,即 RIS (Reset to Initial State),部分终端会因此清空缓冲区。
2. 为什么在 Xshell 中 reset
不彻底清空滚动缓冲区?
-
终端差异:
-
传统终端(如 Linux
tty1
):reset
会清空缓冲区,因为滚动缓冲区由内核管理,重置终端时会一并清除。 -
现代终端(如 Xshell、iTerm2、GNOME Terminal):滚动缓冲区由终端模拟器独立管理,
reset
可能只重置终端状态,不触及历史记录(出于用户体验考虑)。
-
-
Xshell 的特殊性:
-
它默认优先保留用户历史,即使收到
RIS
信号也可能选择不清理缓冲区。
-
3. 验证 reset
的实际行为
在 Xshell 中运行以下命令,观察是否保留历史:
for i in {1..100}; do echo "Line $i"; done # 生成测试内容
reset # 执行重置
如果仍能通过滚轮看到历史内容,说明 reset
未清除缓冲区。(如图)
那接下来可能的原因是:
1. 为什么 \033[3J
和 reset
在 Xshell 中无效?
-
Xshell 的私有实现:
-
Xshell 可能未完全遵循 ANSI 标准,或禁用了某些控制序列(尤其是
\033[3J
这类非标准扩展)。 -
它的滚动缓冲区管理可能是独立于终端协议的(类似日志功能),需通过 GUI 操作触发清理。
-
-
终端安全策略:
-
为防止恶意脚本随意清除用户历史,Xshell 可能故意限制通过命令清除缓冲区。
-
2. 已验证的解决方案
有效方法:(目前博主用到的方法,若还有其他方法欢迎讨论)
✅ 右键菜单 → "Clear Scrollback"
(这是 Xshell 官方提供的强制清除方式,绕过终端协议限制)