Como o comando clear funciona?

33

Recentemente, eu estava tentando aprender mais sobre como o shell funciona e estava olhando como o clearcomando funciona. O executável está localizado /usr/bin/cleare parece imprimir várias linhas em branco (iguais à altura do terminal) e coloca o cursor na parte superior esquerda do terminal.

A saída do comando é sempre a mesma, independentemente do tamanho do terminal:

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

e pode ser replicado com o eco que tem exatamente o mesmo efeito:

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

Fiquei realmente curioso como essa saída desse comando se traduz na limpeza do console.

Eric
fonte
CTRL + L - vejastty -a
mikeserv

Respostas:

26

A saída do clearcomando são códigos de escape do console. Os códigos exatos necessários dependem do terminal exato que você está usando, mas a maioria usa seqüências de controle ANSI. Aqui está um bom link explicando os vários códigos - http://www.termsys.demon.co.uk/vtansi.htm . Os trechos relevantes são:

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.

E:

Erase Screen        <ESC>[2J

Erases the screen with the background colour and moves the cursor to home.

Onde <ESC>é hexadecimal 1Bou octal 033. Outra maneira de visualizar os personagens é com:

clear | sed -n l
Graeme
fonte
18

Ele funciona emitindo determinadas seqüências de escape ANSI . Especificamente, esses dois:

Esc [Line; ColumnH Posição do Cursor:
Esc [Line; Columnf Move o cursor para a posição especificada (coordenadas). Se você não
                                         especificar uma posição, o cursor se moverá para a posição inicial no canto superior esquerdo
                                         da tela (linha 0, coluna 0).

Esc [2J Apagar exibição:
                                         limpa a tela e move o cursor para a posição inicial
                                         (linha 0, coluna 0).

Talvez seja mais fácil entender o resultado de od -c:

$ clear | od -c
0000000 033   [   H 033   [   2   J
0000007

033é Esc, então a saída acima é simples Esc[He então Esc[2J.

terdon
fonte
9

A saída enviada por clear (1) depende do seu tipo de terminal, definido por $ TERM no ambiente do shell. Ele faz o mesmo que o comando "tput clear", que procura o código de escape do tipo de terminal atual e envia essa string para a saída padrão.

O terminal que recebe o código de escape de clear / tput o interpreta e executa o comando enviado, como limpar a exibição local. "terminal" significa o console local ou uma sessão de terminal (putty, xterm, etc.), possivelmente via ssh ou telnet.

mlgoth
fonte
7

Estou surpreso que outras respostas não tenham mencionado TERMINFO (ou TERMCAP)

Use as páginas de manual Luke

man clear diz ...

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.

PRAZO

O clearcomando usa apenas seqüências de escape ANSI se você $TERMestiver definido como ANSI ou algum tipo de terminal baseado em ANSI, como XTERM.

$ 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

INFOCMP

Você pode usar infocmppara investigar

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

TPUT

Ou você pode usar tputpara visualizar um recurso

$ 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
RedGrittyBrick
fonte
6

Além de todas as respostas legais acima, podemos fazer uma análise para ver o que acontece:

$ 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

Você pode ver, dois comandos fornecem o mesmo ANSI escape sequences.

cuonglm
fonte
0

Primeiramente, / bin / echo -e "\ x1b \ x5b \ x48 \ x1b \ x5b \ x32 \ x4a \ c" não limpa a tela. Você pode rolar para cima para ver o conteúdo anterior.

Em segundo lugar, abri o IRB (que é um shell Ruby interativo) e digitei:

p `clear`

Ou

p %x(clear)

Ou:

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

Todos os códigos devem retornar "\e[3J\e[H\e[2J"

Agora abra seu terminal, digite echo -e "\e[3J\e[H\e[2J"

Deve limpar a tela. Eles são chamados de seqüências de escape ANSI:

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

Você pode usar esses códigos para piscar um texto ( \e[5m), colorir um texto: ( for i in {0..255} ; do printf "\e[38;5;${i}m${i} " ; done ; echo) e muitas outras coisas!

S.Goswami
fonte