清晰的命令如何运作?

清晰的命令如何运作?

我最近试图更多地了解 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

033Esc,所以上面的输出就是简单的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.

相关内容