Wie funktioniert Clear Command?

33

Ich habe kürzlich versucht, mehr über die Funktionsweise der Shell zu erfahren und habe mir angesehen, wie der clearBefehl funktioniert. Die ausführbare Datei befindet sich in /usr/bin/clearund scheint ein paar leere Zeilen (gleich der Höhe des Terminals) auszudrucken. Der Cursor befindet sich oben links im Terminal.

Die Ausgabe des Befehls ist unabhängig von der Größe des Terminals immer gleich:

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

und kann mit dem Echo mit genau dem gleichen Effekt repliziert werden:

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

Ich war sehr gespannt, wie sich die Ausgabe dieses Befehls auf das Löschen der Konsole auswirkt.

Eric
quelle
STRG + L - siehestty -a
mikeserv

Antworten:

26

Die Ausgabe des clearBefehls sind Konsolen-Escape-Codes. Die genauen erforderlichen Codes hängen vom verwendeten Terminal ab, die meisten verwenden jedoch ANSI-Steuersequenzen. Hier ist ein guter Link, der die verschiedenen Codes erklärt - http://www.termsys.demon.co.uk/vtansi.htm . Die relevanten Snippets sind:

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.

Und:

Erase Screen        <ESC>[2J

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

Wo <ESC>ist hex 1Boder oktal 033. Eine andere Möglichkeit, die Zeichen anzuzeigen, ist mit:

clear | sed -n l
Graeme
quelle
18

Es funktioniert, indem bestimmte ANSI-Escape-Sequenzen ausgegeben werden . Im Einzelnen sind diese beiden:

Esc [Line; ColumnH Cursor Position:
Esc [Line; Columnf Bewegt den Cursor an die angegebene Position (Koordinaten). Wenn Sie keine
                                         Position angeben, bewegt sich der Cursor an die Ausgangsposition in der oberen linken
                                         Ecke des Bildschirms (Zeile 0, Spalte 0).

Esc [2J Erase Display:
                                         Löscht den Bildschirm und bewegt den Cursor zur Ausgangsposition
                                         (Zeile 0, Spalte 0).

Dies ist vielleicht leichter zu verstehen in der Ausgabe von od -c:

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

033ist Esc, so ist die Ausgabe oben einfach Esc[Hund dann Esc[2J.

terdon
quelle
9

Die von clear (1) gesendete Ausgabe hängt von Ihrem Terminaltyp ab, der in der Shell-Umgebung durch $ TERM definiert ist. Dies entspricht dem Befehl "tput clear", der den Escape-Code für den aktuellen Terminaltyp abfragt und diesen String an die Standardausgabe sendet.

Das Terminal, das den Escape-Code von clear / tput empfängt, interpretiert ihn und führt den gesendeten Befehl aus, z. B. das Löschen der lokalen Anzeige. "terminal" bezeichnet die lokale Konsole oder eine Terminalsitzung (putty, xterm usw.), möglicherweise über ssh oder telnet.

mlgoth
quelle
7

Ich bin überrascht, dass andere Antworten TERMINFO (oder TERMCAP) nicht erwähnt haben.

Verwenden Sie die Manpages Luke

man clear sagt ...

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.

BEGRIFF

Der clearBefehl verwendet nur ANSI-Escape-Sequenzen, wenn Sie $TERMANSI oder einen ANSI-basierten Terminaltyp wie XTERM ausgewählt haben.

$ 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

Sie können verwenden infocmp, um zu untersuchen

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

TPUT

Oder Sie können verwenden tput, um eine Funktion anzuzeigen

$ 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
quelle
6

Zusätzlich zu allen oben genannten Antworten können wir versuchen zu sehen, was passiert:

$ 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

Sie sehen, zwei Befehle liefern dasselbe ANSI escape sequences.

cuonglm
quelle
0

Erstens löscht / bin / echo -e "\ x1b \ x5b \ x48 \ x1b \ x5b \ x32 \ x4a \ c" den Bildschirm nicht wirklich. Sie können nach oben scrollen, um den vorherigen Inhalt anzuzeigen.

Zweitens habe ich IRB (eine interaktive Ruby-Shell) geöffnet und Folgendes eingegeben:

p `clear`

Oder

p %x(clear)

Oder:

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

Alle Codes sollten zurückkehren "\e[3J\e[H\e[2J"

Öffnen Sie nun Ihr Terminal und geben Sie ein echo -e "\e[3J\e[H\e[2J"

Es sollte den Bildschirm löschen. Diese werden als ANSI-Escape-Sequenzen bezeichnet:

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

Sie können diese Codes verwenden, um einen Text zu blinken ( \e[5m), einen Text zu färben: ( for i in {0..255} ; do printf "\e[38;5;${i}m${i} " ; done ; echo) und viele andere Dinge!

S.Goswami
quelle