¿Cómo funciona el comando clear?


33

Recientemente estaba tratando de aprender más sobre cómo funciona el shell y estaba viendo cómo funciona el clearcomando. El ejecutable se encuentra /usr/bin/cleary parece imprimir un montón de líneas en blanco (igual a la altura del terminal) y coloca el cursor en la esquina superior izquierda del terminal.

La salida del comando es siempre la misma, independientemente del tamaño del terminal:

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

y se puede replicar con el eco que tiene exactamente el mismo efecto:

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

Tenía mucha curiosidad por cómo esta salida de este comando se traduce en limpiar la consola.


CTRL + L - mirastty -a
mikeserv

Respuestas:


26

El resultado del clearcomando son los códigos de escape de la consola. Los códigos exactos requeridos dependen del terminal exacto que esté utilizando, sin embargo, la mayoría usa secuencias de control ANSI. Aquí hay un buen enlace que explica los diversos códigos: http://www.termsys.demon.co.uk/vtansi.htm . Los fragmentos relevantes son:

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.

Y:

Erase Screen        <ESC>[2J

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

Donde <ESC>es hexadecimal 1Bu octal 033. Otra forma de ver los personajes es con:

clear | sed -n l

18

Funciona emitiendo ciertas secuencias de escape ANSI . Específicamente, estos dos:

Esc [Línea; ColumnaH Posición del cursor:
Esc [Línea; Columnaf Mueve el cursor a la posición (coordenadas) especificada. Si no
                                         especifica una posición, el cursor se mueve a la posición de inicio en la
                                         esquina superior izquierda de la pantalla (línea 0, columna 0).

Esc [2J Erase Display:
                                         borra la pantalla y mueve el cursor a la posición inicial
                                         (línea 0, columna 0).

Esto es quizás más fácil de entender en la salida de od -c:

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

033es decir Esc, el resultado anterior es simple Esc[Hy luego Esc[2J.


9

El resultado enviado por clear (1) depende de su tipo de terminal, definido por $ TERM en el entorno de shell. Hace lo mismo que el comando "tput clear", que busca el código de escape para el tipo de terminal actual y envía esa cadena a la salida estándar.

El terminal que recibe el código de escape de clear / tput lo interpreta y ejecuta el comando enviado, como borrar la pantalla local. "terminal" significa la consola local o una sesión de terminal (masilla, xterm, etc.), posiblemente a través de ssh o telnet.


7

Me sorprende que otras respuestas no hayan mencionado TERMINFO (o TERMCAP)

Usa las páginas de manual de Luke

man clear dice ...

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.

TÉRMINO

El clearcomando solo usa secuencias de escape ANSI si $TERMestá configurado en ANSI o algún tipo de terminal basado en 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

Puedes usar infocmppara investigar

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

TPUT

O puede usar tputpara ver una capacidad

$ 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

Además de todas las respuestas bonitas anteriores, podemos hacer algunos pasos para ver qué sucede:

$ 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

Puedes ver, dos comandos proporcionan lo mismo ANSI escape sequences.


0

En primer lugar, / bin / echo -e "\ x1b \ x5b \ x48 \ x1b \ x5b \ x32 \ x4a \ c" en realidad no borra la pantalla. Puede desplazarse hacia arriba para ver los contenidos anteriores.

En segundo lugar, abrí IRB (que es un shell Ruby interactivo) y escribí:

p `clear`

O

p %x(clear)

O:

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

Todos los códigos deben regresar "\e[3J\e[H\e[2J"

Ahora abra su terminal, escriba echo -e "\e[3J\e[H\e[2J"

Debería borrar la pantalla. Estas se llaman secuencias de escape ANSI:

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

¡Puede usar estos códigos para parpadear un texto ( \e[5m), colorear un texto: ( for i in {0..255} ; do printf "\e[38;5;${i}m${i} " ; done ; echo) y muchas otras cosas!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.