Ich habe kürzlich versucht, mehr über die Funktionsweise der Shell zu erfahren und habe mir angesehen, wie der clear
Befehl funktioniert. Die ausführbare Datei befindet sich in /usr/bin/clear
und 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.
stty -a
Antworten:
Die Ausgabe des
clear
Befehls 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:Und:
Wo
<ESC>
ist hex1B
oder oktal033
. Eine andere Möglichkeit, die Zeichen anzuzeigen, ist mit:quelle
Es funktioniert, indem bestimmte ANSI-Escape-Sequenzen ausgegeben werden . Im Einzelnen sind diese beiden:
Dies ist vielleicht leichter zu verstehen in der Ausgabe von
od -c
:033
istEsc
, so ist die Ausgabe oben einfachEsc[H
und dannEsc[2J
.quelle
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.
quelle
Ich bin überrascht, dass andere Antworten TERMINFO (oder TERMCAP) nicht erwähnt haben.
Verwenden Sie die Manpages Luke
man clear
sagt ...BEGRIFF
Der
clear
Befehl verwendet nur ANSI-Escape-Sequenzen, wenn Sie$TERM
ANSI oder einen ANSI-basierten Terminaltyp wie XTERM ausgewählt haben.INFOCMP
Sie können verwenden
infocmp
, um zu untersuchenTPUT
Oder Sie können verwenden
tput
, um eine Funktion anzuzeigenquelle
Zusätzlich zu allen oben genannten Antworten können wir versuchen zu sehen, was passiert:
Sie sehen, zwei Befehle liefern dasselbe
ANSI escape sequences
.quelle
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:
Oder
p %x(clear)
Oder:
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!quelle