我最近试图更多地了解 shell 的工作原理,并研究clear
命令的工作原理。可执行文件位于/usr/bin/clear
,它似乎打印出一堆空行(等于终端的高度)并将光标放在终端的左上角。
无论终端大小如何,命令的输出始终相同:
$ clear | hexdump -C
00000000 1b 5b 48 1b 5b 32 4a |.[H.[2J|
00000007
并且可以用具有完全相同效果的 echo 进行复制:
$ /bin/echo -e "\x1b\x5b\x48\x1b\x5b\x32\x4a\c"
我真的很好奇这个命令的输出如何转换为清除控制台。
答案1
该命令的输出clear
是控制台转义码。所需的确切代码取决于您使用的具体终端,但大多数使用 ANSI 控制序列。这是一个很好的链接,解释了各种代码 -http://www.termsys.demon.co.uk/vtansi.htm。相关片段是:
Cursor Home <ESC>[{ROW};{COLUMN}H
Sets the cursor position where subsequent text will begin. If no row/column
parameters are provided (ie. <ESC>[H), the cursor will move to the home position,
at the upper left of the screen.
和:
Erase Screen <ESC>[2J
Erases the screen with the background colour and moves the cursor to home.
哪里<ESC>
是十六进制1B
或八进制033
。查看字符的另一种方法是:
clear | sed -n l
答案2
它的工作原理是发出某些ANSI 转义序列。具体来说,这两个:
Esc[Line;ColumnH 光标位置:
Esc[Line;Columnf 将光标移动到指定位置(坐标)。如果不指定位置,光标将移动到 屏幕左上角的
起始位置(第 0 行,第 0 列)。Esc[2J 擦除显示:
清除屏幕并将光标移动到起始位置
(第 0 行,第 0 列)。
在以下输出中可能更容易理解od -c
:
$ clear | od -c
0000000 033 [ H 033 [ 2 J
0000007
033
是Esc
,所以上面的输出就是简单的Esc[H
和 then Esc[2J
。
答案3
clear(1) 发送的输出取决于您的终端类型,由 shell 环境中的 $TERM 定义。它与命令“tputclear”执行相同的操作,该命令查找当前终端类型的转义码并将该字符串发送到标准输出。
从clear/tput接收转义码的终端解释它并执行发送的命令,例如清除本地显示。 “终端”是指本地控制台或终端会话(putty、xterm 等),可能通过 ssh 或 telnet。
答案4
除了上面所有好的答案之外,我们还可以做一些 strace 来看看会发生什么:
$ strace -e trace=write echo -e "\x1b\x5b\x48\x1b\x5b\x32\x4a\c"
write(1, "\33[H\33[2J", 7
$ strace -e trace=write clear
write(1, "\33[H\33[2J", 7
您可以看到,两个命令提供相同的ANSI escape sequences
.