Come funziona il comando clear?


33

Di recente stavo cercando di saperne di più su come funziona la shell e stavo guardando come funziona il clearcomando. Il file eseguibile si trova all'interno /usr/bin/cleare sembra stampare un mucchio di righe vuote (pari all'altezza del terminale) e posiziona il cursore nella parte superiore sinistra del terminale.

L'output del comando è sempre lo stesso, indipendentemente dalle dimensioni del terminale:

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

e può essere replicato con l'eco con lo stesso identico effetto:

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

Ero davvero curioso di come questo output di questo comando si traduca nel cancellare la console.


CTRL + L - guardastty -a
mikeserv

Risposte:


26

L'output del clearcomando sono i codici di escape della console. I codici esatti richiesti dipendono dal terminale esatto che si sta utilizzando, tuttavia la maggior parte utilizza sequenze di controllo ANSI. Ecco un buon link che spiega i vari codici: http://www.termsys.demon.co.uk/vtansi.htm . I frammenti rilevanti sono:

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.

Dov'è <ESC>esadecimale 1Bo ottale 033. Un altro modo per visualizzare i personaggi è con:

clear | sed -n l

18

Funziona emettendo determinate sequenze di escape ANSI . In particolare, questi due:

Esc [Linea; ColonnaH Posizione cursore:
Esc [Linea; Colonnaf Sposta il cursore nella posizione specificata (coordinate). Se non si
                                         specifica una posizione, il cursore si sposta sulla posizione iniziale
                                         nell'angolo in alto a sinistra dello schermo (linea 0, colonna 0).

Esc [2J Cancella display:
                                         cancella lo schermo e sposta il cursore nella posizione iniziale
                                         (riga 0, colonna 0).

Questo è forse più facile da capire nell'output di od -c:

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

033è Esc, quindi l'output sopra è semplicemente Esc[He quindi Esc[2J.


9

L'output inviato da clear (1) dipende dal tipo di terminale, definito da $ TERM nell'ambiente shell. Fa la stessa cosa del comando "tput clear", che cerca il codice di escape per il tipo di terminale corrente e invia quella stringa all'output standard.

Il terminale che riceve il codice di escape da clear / tput lo interpreta ed esegue il comando inviato, come cancellare il display locale. "terminale" indica la console locale o una sessione terminale (putty, xterm, ecc.), possibilmente via ssh o telnet.


7

Sono sorpreso che altre risposte non abbiano menzionato TERMINFO (o TERMCAP)

Usa le pagine man 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.

TERMINE

Il clearcomando utilizza sequenze di escape ANSI solo se $TERMè impostato su ANSI o su un tipo di terminale basato su ANSI come 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

Puoi usare infocmpper indagare

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

tput

Oppure puoi usare tputper visualizzare una funzionalità

$ 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

Oltre a tutte le belle risposte sopra, possiamo fare qualche passo per vedere cosa succede:

$ 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

Puoi vedere, due comandi forniscono lo stesso ANSI escape sequences.


0

In primo luogo / bin / echo -e "\ x1b \ x5b \ x48 \ x1b \ x5b \ x32 \ x4a \ c" non cancella realmente lo schermo. Puoi scorrere verso l'alto per vedere i contenuti precedenti.

In secondo luogo, ho aperto IRB (che è una shell Ruby interattiva) e ho digitato:

p `clear`

O

p %x(clear)

O:

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

Tutti i codici dovrebbero tornare "\e[3J\e[H\e[2J"

Ora apri il tuo terminale, digita echo -e "\e[3J\e[H\e[2J"

Dovrebbe cancellare lo schermo. Queste sono chiamate sequenze di escape ANSI:

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

Puoi usare questi codici per lampeggiare un testo ( \e[5m), colorare un testo: ( for i in {0..255} ; do printf "\e[38;5;${i}m${i} " ; done ; echo) e molte altre cose!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.