GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi "effacer" ne pas effacer tout l'écran ?

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.

  1. Le clear La commande examine terminfo/termcap et émet les séquences de contrôle appropriées.
    1. 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 le clear commande.
    2. Il utilise ensuite le clear capacité à effacer l'écran visible.
  2. 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éfinit E3=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éfinissent clear=E[HE[J ou quelque chose de similaire. Il s'agit de deux séquences de contrôle ECMA-48 ordinaires.
  3. 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 CSI J 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.

En ce qui concerne le terminal GNOME en particulier :

  1. Le type de terminal est correctement gnome , mais certaines personnes le laissent par erreur défini sur xterm .
  2. Le gnome l'entrée terminfo ne définit pas un E3 capacité, et sur de nombreux systèmes — encore ! — le xterm non plus entrée car cela n'a pas percolé de Dickey terminfo. Donc clear écrit simplement le contenu du clear capacité.
  3. 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.
  4. 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.
En relation:À quel jeu appartient cette capture d'écran représentant une scène de nature sauvage?

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.

Linux
  1. Pourquoi Ctrl-L n'efface pas l'écran dans Bash ? Comment lier les clés sous Linux ?

  2. Pourquoi Find n'accepte-t-il pas '-exec Cp {} Dir +' ?

  3. La commande de mise en veille à l'aide de la commande d'écran ne s'affiche pas dans Ps ?

  4. Pourquoi `exit &` ne fonctionne pas ?

  5. Pourquoi ne vois-je pas MSG_EOR pour SOCK_SEQPACKET sous Linux ?

Pourquoi un long délai après la commande introuvable ?

Linux - Pourquoi Setuid ne fonctionne-t-il pas ??

Pourquoi est-ce Rm -rf et non Rmdir -rf ?

Comment effacer le terminal sous Linux {Effacer l'écran sous Linux}

Comment effacer le scrollback dans la commande screen ?

Effacer un écran de terminal pour de vrai