清除命令如何工作?


33

最近,我试图了解有关Shell如何工作的更多信息,并正在研究clear命令的工作方式。该可执行文件位于其中,/usr/bin/clear它似乎打印出一堆空行(等于终端的高度),并将光标置于终端的左上角。

无论终端的大小如何,命令的输出始终相同:

$ clear | hexdump -C
00000000  1b 5b 48 1b 5b 32 4a                              |.[H.[2J|
00000007

并可以使用具有完全相同效果的回声进行复制:

$ /bin/echo -e "\x1b\x5b\x48\x1b\x5b\x32\x4a\c"

我真的很好奇这个命令的输出如何转换为清除控制台。


CTRL + L-看看stty -a
mikeserv

Answers:


26

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

18

它通过发出某些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[Hthen Esc[2J


9

clear(1)发送的输出取决于您的终端类型,该类型由$ TERM在shell环境中定义。它与命令“ tput clear”具有相同的功能,该命令查找当前终端类型的转义码并将该字符串发送到标准输出。

从clear / tput接收到转义码的终端会对其进行解释并执行发送的命令,例如清除本地显示。“终端”是指本地控制台或终端会话(putty,xterm等),可能通过ssh或telnet。


7

我很惊讶其他答案没有提到TERMINFO(或TERMCAP)

使用手册卢克

man clear 说...

NAME
       clear - clear the terminal screen

SYNOPSIS
       clear

DESCRIPTION
       clear clears your screen if this is possible.  It looks in the environ-
       ment for the terminal type and then in the terminfo database to  figure
       out how to clear the screen.

术语

clear如果将$TERM设置为ANSI或某些基于ANSI的终端类型(例如XTERM),则该命令仅使用ANSI转义序列。

$ TERM=ansi clear | hexdump -C
00000000  1b 5b 48 1b 5b 4a                                 |.[H.[J|
00000006

$ TERM=wy50 clear | hexdump -C
00000000  1b 2b                                             |.+|
00000002

$ TERM=hurd clear | hexdump -C
00000000  1b 63                                             |.c|
00000002

$ TERM=glasstty clear | hexdump -C
00000000  0c                                                |.|
00000001

$ TERM=vt52 clear | hexdump -C
00000000  1b 48 1b 4a                                       |.H.J|
00000004

$ TERM=hpterm clear | hexdump -C
00000000  1b 26 61 30 79 30 43 1b  4a                       |.&a0y0C.J|
00000009

信息CMP

您可以infocmp用来调查

$ infocmp -L -1 hpterm | grep clear_screen
        clear_screen=\E&a0y0C\EJ,

TPUT

或者您可以tput用来查看功能

$ tput -T hpterm clear | hexdump -C
00000000  1b 26 61 30 79 30 43 1b  4a                       |.&a0y0C.J|
00000009


$ tput -T hpterm reset | hexdump -C
00000000  20 20 20 20 20 20 20 20  1b 31 20 20 20 20 20 20  |        .1      |
00000010  20 20 1b 31 20 20 20 20  20 20 20 20 1b 31 20 20  |  .1        .1  |
00000020  20 20 20 20 20 20 1b 31  20 20 20 20 20 20 20 20  |      .1        |
00000030  1b 31 20 20 20 20 20 20  20 20 1b 31 20 20 20 20  |.1        .1    |
00000040  20 20 20 20 1b 31 20 20  20 20 20 20 20 20 1b 31  |    .1        .1|
00000050  20 20 20 20 20 20 20 20  1b 31 20 20 20 20 20 20  |        .1      |
00000060  20 20 1b 31                                       |  .1|
00000064

6

除了上面所有不错的答案之外,我们还可以做一些追踪,看看会发生什么:

$ 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


0

首先/ bin / echo -e“ \ x1b \ x5b \ x48 \ x1b \ x5b \ x32 \ x4a \ c”并不能真正清除屏幕。您可以向上滚动以查看先前的内容。

其次,我打开了IRB(这是一个交互式Ruby Shell),然后键入:

p `clear`

要么

p %x(clear)

要么:

require 'open3'
p Open3.capture2('clear')[0]

所有代码应返回 "\e[3J\e[H\e[2J"

现在打开终端,输入 echo -e "\e[3J\e[H\e[2J"

它应该清除屏幕。这些称为ANSI转义序列:

https://zh.wikipedia.org/wiki/ANSI_escape_code

您可以使用这些代码来使文本(\e[5m)闪烁,为文本加色((for i in {0..255} ; do printf "\e[38;5;${i}m${i} " ; done ; echo)以及许多其他功能!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.