Quand j'utilise clear
commande pour effacer l'écran. Il n'est pas effacé (voir capture d'écran lorsque je fais défiler un peu après la commande)
Je double donc la commande pour obtenir le bon comportement :
$ clear && clear && DD=0 ...
Pourquoi dois-je doubler la commande pour effacer l'écran ?
UPD
En fait, si j'clear
J'ai effacé l'écran. Mais je peux faire défiler vers le haut et voir les 25 dernières lignes (si l'écran est de 80 × 25). Lorsque j'exécute clear;clear
J'ai effacé ces lignes.
Réponse acceptée :
La chose importante à noter ici est la balise sur la question. Ce comportement est spécifique au terminal GNOME et à tout autre émulateur de terminal basé sur libvte. Vous ne verrez pas cela dans Xterm, ni dans Unicode RXVT, ni dans l'émulateur de terminal intégré au noyau Linux, ni sur la console FreeBSD.
Voici ce qui se passe en général.
- Le
clear
La commande examine terminfo/termcap et émet les séquences de contrôle appropriées.- Si l'entrée terminfo/termcap a un
E3
capacité, il écrit d'abord que. Cela émet des séquences de contrôle pour effacer le tampon de défilement. Ceci et l'histoire derrière cela sont documentés en détail dans la page de manuel de Dickey ncurses pour leclear
commande. - Il utilise ensuite le
clear
capacité à effacer l'écran visible.
- Si l'entrée terminfo/termcap a un
- Les séquences de contrôle dans l'entrée terminfo/termcap sont déterminées par le type de terminal ; mais, à l'exception des terminaux (aujourd'hui rares) qui utilisent FormFeed pour effacer l'écran (ce que les DEC VT et leurs imitateurs ne font pas), ce sont soit de simples séquences de contrôle ECMA-48, soit des extensions de celles-ci. Par exemple :
- Le
putty
l'entrée définitE3=E[3J
qui est la séquence de contrôle de l'extension Xterm. - Le
pcvtxx
de la console NetBSD l'entrée est l'une des nombreuses qui définissentclear=E[HE[J
ou quelque chose de similaire. Il s'agit de deux séquences de contrôle ECMA-48 ordinaires.
- Le
- L'émulateur de terminal agit sur les séquences de contrôle. Tel que défini par ECMA-48 et son extension Xterm :
- CSI
H
(CUP) place le curseur. - CSI
J
(ED 0) ou juste CSIJ
efface de la position actuelle du curseur jusqu'à la fin de l'écran. - CSI
2
J
(ED 2) efface tout l'écran. - CSI
3
J
(ED 3) efface le tampon de défilement.
- CSI
En ce qui concerne le terminal GNOME en particulier :
- Le type de terminal est correctement
gnome
, mais certaines personnes le laissent par erreur défini surxterm
. - Le
gnome
l'entrée terminfo ne définit pas unE3
capacité, et sur de nombreux systèmes — encore ! — lexterm
non plus entrée car cela n'a pas percolé de Dickey terminfo. Doncclear
écrit simplement le contenu duclear
capacité. - Le contenu du
clear
la capacité pour ces entrées terminfo sont les séquences de contrôle pour placer le curseur à l'origine, suivies de l'effacement de tout l'écran. - Mais le terminal GNOME n'implémente pas correctement l'effacement de tout l'écran. Plus précisément, la bibliothèque sur laquelle il est basé, libvte, ne le fait pas dans le code de son
VteTerminalPrivate::seq_clear_screen()
une fonction. Au lieu de cela, libvte fait défiler l'écran vers le bas d'un écran entier de lignes vides et déplace la position du curseur sur la première de ces lignes vides.
C'est pourquoi vous voyez ce que vous voyez. libvte n'efface pas tout l'écran lorsqu'on lui demande de le faire. Il s'agit plutôt de faire quelque chose qui ressemble superficiellement à cela, jusqu'à ce que l'on fasse exactement ce que le questionneur a fait ici :faire défiler la fenêtre du terminal pour regarder le tampon de défilement arrière. Alors la différence est flagrante.
Sur d'autres émulateurs de terminaux tels que Xterm et Unicode RXVT, la séquence de contrôle ED 2 efface vraiment l'écran, effaçant chaque position sur l'écran en place, de haut en bas, et ne modifiant pas le tampon de défilement. Mais sur les émulateurs de terminaux libvte, il pousse simplement l'écran actuel dans le tampon de défilement et ajoute une valeur d'écran de lignes vides. Le contenu de l'écran précédent n'est pas effacé mais décalé dans le tampon de défilement.
Et si vous exécutez le clear
commande deux fois, elle en ajoute deux la valeur de l'écran de lignes vides. Si votre tampon de défilement arrière est suffisamment grand, vous pouvez toujours trouver le contenu de l'écran d'origine, simplement plus haut dans le tampon de défilement.
Autres lectures
- Fonctions de contrôle pour les jeux de caractères codés . ECMA-48. 1976.
- Georgi Kirilov (2007-12-30). Ctrl-L ajoute un espace vide au tampon de défilement . Bogue GNOME #506438.
- Dans quelle mesure les émulateurs de terminaux xterm, xterm-color et Linux sont-ils basés sur VT100 ?
- Effacer l'"ancien" tampon de défilement
- Le comportement étrange de la commande Bash clear supprime le tampon de défilement.
- https://superuser.com/questions/1094599/
- Thomas Dickey (2018). « Bogues connus dans XTerm et sosies :Terminal GNOME ». Foire aux questions sur XTerm . invisible-island.net.
- Thomas Dickey (2018). "Bugs connus dans XTerm et sosies :notes sur VTE". Foire aux questions sur XTerm . invisible-island.net.