J'essayais récemment d'en savoir plus sur le fonctionnement du shell et sur le fonctionnement de la clear
commande. L'exécutable est situé dans /usr/bin/clear
et il semble imprimer un tas de lignes vierges (égales à la hauteur du terminal) et place le curseur en haut à gauche du terminal.
La sortie de la commande est toujours la même, quelle que soit la taille du terminal:
$ clear | hexdump -C
00000000 1b 5b 48 1b 5b 32 4a |.[H.[2J|
00000007
et peut être reproduit avec l’écho ayant exactement le même effet:
$ /bin/echo -e "\x1b\x5b\x48\x1b\x5b\x32\x4a\c"
J'étais vraiment curieux de savoir comment cette sortie de cette commande se traduisait par un effacement de la console.
stty -a
Réponses:
Le résultat de la
clear
commande est les codes d’échappement de la console. Les codes exacts requis dépendent du terminal que vous utilisez, mais la plupart utilise des séquences de contrôle ANSI. Voici un bon lien expliquant les différents codes - http://www.termsys.demon.co.uk/vtansi.htm . Les extraits pertinents sont:Et:
Où
<ESC>
est hex1B
ou octal033
. Une autre façon de voir les personnages est avec:la source
Cela fonctionne en émettant certaines séquences d'échappement ANSI . Plus précisément, ces deux:
C’est peut-être plus facile à comprendre dans le résultat de
od -c
:033
estEsc
, donc la sortie ci-dessus est simplementEsc[H
et alorsEsc[2J
.la source
La sortie envoyée par clear (1) dépend de votre type de terminal, défini par $ TERM dans l'environnement shell. Il fait la même chose que la commande "tput clear", qui recherche le code d'échappement du type de terminal actuel et envoie cette chaîne à la sortie standard.
Le terminal recevant le code d'échappement de clear / tput l'interprète et exécute la commande envoyée, telle que l'effacement de l'affichage local. "terminal" signifie la console locale ou une session de terminal (putty, xterm, etc.), éventuellement via ssh ou telnet.
la source
Je suis surpris que d'autres réponses n'aient pas mentionné TERMINFO (ou TERMCAP)
Utilisez les pages de manuel de Luke
man clear
dit ...TERME
La
clear
commande utilise uniquement les séquences d'échappement ANSI si votre$TERM
est défini sur ANSI ou sur un type de terminal basé sur ANSI tel que XTERM.INFOCMP
Vous pouvez utiliser
infocmp
pour enquêterTPUT
Ou vous pouvez utiliser
tput
pour afficher une capacitéla source
En plus de toutes les bonnes réponses ci-dessus, nous pouvons faire quelques efforts pour voir ce qui se passe:
Vous pouvez voir que deux commandes fournissent la même chose
ANSI escape sequences
.la source
Premièrement, / bin / echo -e "\ x1b \ x5b \ x48 \ x1b \ x5b \ x32 \ x4a \ c" n'efface pas vraiment l'écran. Vous pouvez faire défiler vers le haut pour voir le contenu précédent.
Deuxièmement, j'ai ouvert IRB (qui est un shell Ruby interactif) et tapé:
Ou
p %x(clear)
Ou:
Tous les codes doivent retourner
"\e[3J\e[H\e[2J"
Maintenant, ouvrez votre terminal, tapez
echo -e "\e[3J\e[H\e[2J"
Il devrait effacer l'écran. Celles-ci sont appelées séquences d'échappement ANSI:
https://en.wikipedia.org/wiki/ANSI_escape_code
Vous pouvez utiliser ces codes pour faire clignoter un texte (
\e[5m
), coloriser un texte: (for i in {0..255} ; do printf "\e[38;5;${i}m${i} " ; done ; echo
) et bien d'autres choses!la source