Quelques mots de notre bureau de traduction: généralement tout le monde veut traduire les derniers documents et publications, et nous ne faisons pas exception. Mais les terminaux ne sont pas mis à jour une fois par semaine. Par conséquent, nous avons traduit pour vous un article d'Antoine Bopre publié au printemps 2018: malgré le solide «âge» selon les normes modernes, à notre avis, le matériel n'a pas complètement perdu sa pertinence. De plus, l'original est une série de deux articles, mais nous avons décidé de les combiner en un seul gros post.
Les terminaux occupent une place particulière dans l'histoire de l'ordinateur, mais au cours des dernières décennies, ils ont été "contraints" de survivre littéralement avec la ligne de commande dans le contexte d'interfaces graphiques omniprésentes.
Les émulateurs de terminaux ont remplacé leurs
homologues matériels , qui, à leur tour, étaient une modification des systèmes sur les cartes perforées et les interrupteurs à bascule. Les distributions modernes sont livrées avec une multitude d'émulateurs de terminaux de toutes formes et couleurs. Et tandis que beaucoup se contentent tranquillement du terminal standard fourni par leur environnement de travail, certains sont fiers d'utiliser un logiciel franchement exotique pour lancer leur shell ou éditeur de texte préféré. Mais, comme nous le verrons dans cet article, tous les terminaux n'ont pas été créés dans une même image et ressemblance: ils varient considérablement en termes de fonctionnalité, de taille et de performances.
Certains terminaux ont des trous de sécurité incroyables, de plus, la plupart ont un ensemble de fonctions complètement différent, de la prise en charge de l'interface à onglets aux scripts. Bien que nous ayons
examiné les émulateurs de terminaux dans un passé lointain , cet article est une mise à jour du matériel précédent qui aidera les lecteurs à déterminer le terminal à utiliser en 2018. La première moitié de l'article compare les fonctions et la seconde moitié évalue les performances.
Voici les terminaux que j'ai examinés:

Ce ne sont peut-être pas les dernières versions, car je me suis limité aux versions stables au moment de la rédaction, que j'ai pu déployer sur Debian 9 ou Fedora 27. La seule exception est Alacritty. Il est un descendant de terminaux avec accélération GPU et est écrit dans un langage inhabituel et nouveau pour cette tâche - Rust. J'ai exclu les terminaux Web de mon examen (y compris sur
Electron ), car les tests préliminaires ont montré leurs performances extrêmement médiocres.
Prise en charge Unicode
J'ai commencé mes tests avec le support Unicode. Le premier test terminal était d'afficher une chaîne Unicode à partir d'
un article Wikipedia : "é, Δ ,,, ק, م, ๗, あ, 叶, 葉 et 말." Ce test simple montre si le terminal peut fonctionner correctement dans le monde entier. Le terminal xterm n'affiche pas le symbole
Mem arabe dans la configuration par défaut:

Par défaut, xterm utilise la police classique «fixe» qui, selon
Wiki , a «une couverture Unicode importante depuis 1997». Quelque chose se produit dans cette police qui fait apparaître le caractère comme un cadre vide et ce n'est que lorsque la police de texte est augmentée à 20+ points que le caractère commence enfin à s'afficher correctement. Cependant, une telle «correction» interrompt l'affichage des autres caractères Unicode:

Ces captures d'écran ont été prises dans Fedora 27, car elles donnaient de meilleurs résultats que Debian 9, où certaines anciennes versions de terminaux (en particulier mlterm) ne pouvaient pas fonctionner correctement avec les polices. Heureusement, cela a été corrigé dans les versions ultérieures.
Faites maintenant attention au mappage des chaînes dans xterm. Il s'avère que le symbole Mem et le
Qoph sémitique
suivant appartiennent à des
scripts RTL (de
droite à gauche ), donc techniquement, ils doivent être affichés de droite à gauche. Les navigateurs Web, tels que Firefox 57, gèrent correctement la ligne ci-dessus. Une version plus simple du texte RTL est le mot "
Sarah " en hébreu (
שרה ).
La page wiki bidirectionnelle dit ce qui suit:
«De nombreux programmes informatiques ne peuvent pas afficher correctement le texte bidirectionnel. Par exemple, le nom hébreu "Sarah" se compose des symboles sin (ש) (qui apparaît à droite), puis resh (ר) et, enfin, heh (ה) (qui devrait apparaître à gauche). "
De nombreux terminaux échouent à ce test: Alacritty, les terminaux dérivés de VTE Gnome et XFCE, urxvt, st et xterm affichent «Sarah» dans l'ordre inverse, comme si nous épelions ce nom par «Aras».

Un autre problème avec les textes bidirectionnels est qu'ils doivent être alignés d'une manière ou d'une autre, surtout quand il s'agit de mélanger des textes RTL et LTR. Les scripts RTL doivent s'exécuter sur le côté droit de la fenêtre du terminal, mais que doit-il se passer pour les terminaux utilisant l'anglais LTR par défaut? La plupart d'entre eux n'ont aucun mécanisme spécial et alignent tout le texte à gauche (y compris Konsole). Les exceptions sont pterm et mlterm, qui respectent les normes et alignent ces lignes vers la droite.

Protection d'insertion
La prochaine caractéristique critique que j'ai déterminée par moi-même est la protection contre l'insertion. Bien qu'il soit largement connu que des sorts comme:
$ curl http://example.com/ | sh
sont des commandes d'exécution de code push; peu de gens savent que les commandes cachées peuvent pénétrer la console lors de la copie et du collage à partir d'un navigateur Web, même après une inspection approfondie.
Le site de test de Gianna Horne montre avec brio à quel point l'équipe semble inoffensive:
git clone git: //git.kernel.org/pub/scm/utils/kup/kup.git
cela se transforme en une telle nuisance lors du collage du site Web Horn dans le terminal:
git clone /dev/null; clear; echo -n "Hello "; whoami|tr -d '\n'; echo -e '!\nThat was a bad idea. Don'"'"'t copy code from websites you don'"'"'t trust! \ Here'"'"'s the first line of your /etc/passwd: '; head -n1 /etc/passwd git clone git://git.kernel.org/pub/scm/utils/kup/kup.git
Comment ça marche? Le code malveillant est placé dans le bloc
<span> , qui est déplacé du champ de vision de l'utilisateur à l'aide de CSS.
Le mode de collage entre crochets est clairement conçu pour neutraliser de telles attaques. Dans ce mode, les terminaux enferment le texte inséré dans une paire de séquences d'échappement spéciales pour informer le shell de l'origine de ce texte. Le shell reçoit donc un signal indiquant qu'il peut ignorer les caractères spéciaux que le texte inséré peut contenir. Tous les terminaux, jusqu'à la vénérable xterm, prennent en charge cette fonction, mais l'insertion en mode Bracketed nécessite la prise en charge d'un shell ou d'une application s'exécutant sur le terminal. Par exemple, un logiciel utilisant
GNU Readline (le même Bash) a besoin d'un
fichier ~ / .inputrc :
set enable-bracketed-paste on
Malheureusement, le site de test Horn montre également comment contourner cette protection en formatant le texte lui-même et en mettant fin prématurément à l'application du mode Bracketing. Cela fonctionne car certains terminaux ne filtrent pas correctement les séquences d'échappement avant d'ajouter les leurs. Par exemple, dans le mien, je n'ai pas pu terminer avec succès les tests de Konsole, même en tenant compte de la configuration correcte du fichier
.inputrc . Cela signifie que vous pouvez facilement obtenir des dommages de configuration du système en raison d'une application non prise en charge ou d'un shell mal configuré. Cela est particulièrement dangereux lors de la saisie de serveurs distants, où une étude minutieuse de la configuration est moins courante, surtout si vous disposez de nombreuses machines distantes de ce type.
Une bonne solution à ce problème est le plugin de confirmation de
collage pour le terminal
urxvt , qui demande simplement l'autorisation de coller tout texte contenant de nouvelles lignes. Je n'ai pas trouvé d'option plus sûre pour l'attaque de texte décrite par Horn.
Onglets et profils
Une fonctionnalité populaire consiste désormais à prendre en charge une interface à onglets, que nous définirons comme une seule fenêtre de terminal contenant quelques autres terminaux. Pour différents terminaux, cette fonction est différente, et bien que les terminaux traditionnels comme xterm ne prennent pas du tout en charge les onglets, les incarnations de terminaux plus modernes représentées par Xfce Terminal, GNOME Terminal et Konsole ont cette fonction. Urxvt prend également en charge les onglets, mais uniquement si le plug-in est utilisé. Mais en termes de prise en charge des onglets en tant que tels, Terminator est le leader incontesté: il prend non seulement en charge les onglets, mais peut également organiser les terminaux dans n'importe quel ordre (voir l'image ci-dessous).

Une autre caractéristique de Terminator est la possibilité de «regrouper» ces onglets et d'envoyer les mêmes frappes à plusieurs terminaux en même temps, ce qui fournit un outil grossier pour effectuer des opérations en bloc sur plusieurs serveurs simultanément. Une fonctionnalité similaire est également implémentée dans Konsole. Pour utiliser cette fonction dans d'autres terminaux, vous devez utiliser un logiciel tiers tel que
Cluster SSH ,
xlax ou
tmux .
Les onglets fonctionnent particulièrement bien avec les profils: par exemple, vous pouvez avoir un onglet pour le courrier électronique, un autre pour le chat, etc. Ceci est bien pris en charge par Konsole et GNOME Terminal. Les deux permettent à chaque onglet de lancer automatiquement son profil. Terminator prend également en charge les profils, mais je n'ai pas trouvé de moyen de lancer automatiquement certains programmes lorsque j'ouvre un certain onglet. D'autres terminaux n'ont pas du tout le concept de profil.
Ryushechki
La dernière chose que je considérerai dans la première partie de cet article est l'apparence des terminaux. Par exemple, GNOME, Xfce et urxvt prennent en charge la transparence, mais ont récemment supprimé la prise en charge des images d'arrière-plan, forçant certains utilisateurs à basculer vers le terminal
Tilix . Personnellement, je suis content de
Xresources , qui définit l'ensemble de base des couleurs d'arrière-plan pour urxvt. Cependant, les thèmes de couleurs personnalisés peuvent provoquer des problèmes. Par exemple,
Solarized ne fonctionne pas avec les
applications htop et
IPTraf , car elles utilisent déjà leurs propres couleurs.
Le terminal VT100 d'origine ne prend pas en charge les couleurs, et les nouveaux sont souvent limités à une palette de 256 couleurs. Pour les utilisateurs avancés qui modèlent leurs terminaux, les requêtes shell ou les barres d'état de certaines manières complexes peuvent être une limitation désagréable.
Gist garde une trace des terminaux qui prennent en charge True Color. Mes tests confirment que les terminaux basés sur st, Alacritty et VTE prennent parfaitement en charge True Color. À cet égard, d'autres terminaux ne se sentent pas très bien et, en fait, n'affichent même pas 256 couleurs. Ci-dessous, vous pouvez voir la différence entre la prise en charge de True Color dans les terminaux GNOME, st et xterm, qui font un bon travail avec leur palette de 256 couleurs, et urxvt, qui non seulement échoue au test, mais affiche même quelques caractères clignotants à la place eux.

Certains terminaux analysent également le texte pour les modèles d'URL afin de rendre les liens cliquables. Cela s'applique à tous les terminaux dérivés de VTE, tandis que urxvt nécessite un plug-in spécial qui transforme les URL en un clic ou un raccourci clavier. D'autres terminaux que j'ai testés affichent d'autres URL.
Enfin, une nouvelle tendance pour les terminaux est l'option de tampon de défilement. Par exemple, dans st, il n'y a pas de tampon de défilement; il est supposé que l'utilisateur utilisera un multiplexeur de terminal comme tmux et
GNU Screen .
Alacritty manque également de tampons de défilement inversés, mais le support
sera bientôt ajouté en raison des "commentaires approfondis" des utilisateurs sur ce sujet. En plus de ces nouveaux arrivants, chaque terminal que j'ai testé que je pouvais trouver prend en charge le défilement vers l'arrière.
Sous-totaux
Dans la deuxième partie du matériel (
dans l'original, il s'agissait de deux articles différents, - environ Per. ) Nous comparerons les performances, l'utilisation de la mémoire et le délai. Mais nous constatons déjà que certains des terminaux en question présentent de graves lacunes. Par exemple, les utilisateurs qui travaillent régulièrement avec des scripts RTL peuvent prêter attention à mlterm et pterm, car ils gèrent mieux ces tâches que d'autres. Konsole a également bien performé. Les utilisateurs qui ne travaillent pas avec les scripts RTL peuvent choisir autre chose.
Du point de vue de la sécurité contre l'insertion de code malveillant, urxvt se démarque par sa mise en œuvre particulière de protection contre ce type d'attaque, ce qui me semble tout à fait pratique. Ceux qui recherchent des cloches et des sifflets devraient regarder Konsole. Enfin, il convient de noter que VTE est une excellente base pour les terminaux, ce qui garantit la prise en charge des couleurs, la reconnaissance des URL, etc. À première vue, le terminal par défaut fourni avec votre environnement préféré peut répondre à toutes les exigences, mais laissons cette question ouverte jusqu'à ce que nous trouvions les performances.
Continuez la conversation
En général, les performances des terminaux en soi peuvent sembler farfelues, cependant, comme il s'est avéré, certains d'entre eux démontrent un retard étonnamment important pour les logiciels de ce type fondamental. Nous examinerons également plus en détail ce que l’on appelle traditionnellement la «vitesse» (en fait, c’est la vitesse de défilement) et la consommation de mémoire du terminal (étant donné qu’aujourd’hui ce n’est pas aussi critique qu’il y a des décennies).
Retard
Après une étude approfondie des performances du terminal, je suis arrivé à la conclusion que le paramètre le plus important à cet égard est la taille du retard (ping). Dans son article
«Nous imprimons avec plaisir», Pavel Fatin a examiné le retard de divers éditeurs de texte et a laissé entendre que les terminaux à cet égard peuvent fonctionner plus lentement que les éditeurs de texte les plus rapides. C'est cet indice qui m'a finalement conduit à lancer mes propres tests et à écrire cet article.
Mais qu'est-ce qu'un retard et pourquoi est-il si important? Dans son article, Fatin l'a défini comme «le délai entre la pression d'une touche et la mise à jour d'écran correspondante» et a cité le
«Manuel sur l'interaction homme-machine» comme disant: «Le retard dans la rétroaction visuelle sur l'écran de l'ordinateur a un effet important sur le comportement de la dactylo et sa satisfaction ".
Fatin explique qu'un tel ping a des conséquences plus profondes que la simple satisfaction: "la frappe devient plus lente, plus d'erreurs se produisent, la tension oculaire et musculaire augmente." En d'autres termes, un retard important peut entraîner des fautes de frappe, ainsi qu'une diminution de la qualité du code, car il entraîne une charge cognitive supplémentaire sur le cerveau. Mais pire encore, le ping «augmente la tension des yeux et des muscles», ce qui, apparemment, implique le
développement de lésions professionnelles à l'avenir (
apparemment, l'auteur signifie des problèmes avec les muscles des yeux, du dos, des bras et, bien sûr, de la vision, - environ Per. ) En raison du stress répétitif.
Certains de ces effets sont connus depuis longtemps et les résultats d'une
étude publiée en 1976 dans la revue Ergonomics indiquent qu'un retard de 100 millisecondes "aggrave considérablement la vitesse de numérotation". Plus récemment,
un temps de
réponse acceptable de 10 millisecondes a été introduit dans le guide de l'utilisateur GNOME, et si nous allons plus loin,
Microsoft Research montre qu'une milliseconde est idéale.
Fatin a effectué ses tests sur des éditeurs de texte; il a créé un outil portable appelé
Typometer , que j'ai utilisé pour tester le ping dans les émulateurs de terminaux. Gardez à l'esprit que le test a été effectué en mode simulation: en réalité, nous devons également prendre en compte le délai d'entrée (clavier, contrôleur USB, etc.) et la sortie (tampon de carte vidéo, moniteur). Selon Fatin, dans les configurations typiques, elle est d'environ 20 ms. Si vous avez un équipement de jeu, vous pouvez atteindre un indicateur de seulement 3 millisecondes. Étant donné que nous disposons déjà d'un équipement aussi rapide, l'application ne devrait pas également introduire son retard. L'objectif de Fatin est de retarder l'application jusqu'à 1 milliseconde, ou de réaliser la numérotation sans
délai mesurable , comme dans
IntelliJ IDEA 15 .
Et voici les résultats de mes mesures, ainsi que quelques résultats de Fatin afin de montrer que mon expérience est cohérente avec ses tests:

La première chose qui m'a frappé a été le meilleur temps de réponse pour les programmes plus anciens tels que xterm et mlterm. Avec la pire latence de registre (2,4 ms), ils ont montré de meilleurs résultats que le terminal moderne le plus rapide (10,6 ms pour st). Pas un seul terminal moderne ne tombe en dessous d'un seuil de 10 millisecondes. En particulier, Alacritty ne répond pas aux exigences de «l'émulateur de terminal existant le plus rapide», bien que ses résultats se soient améliorés depuis le premier contrôle en 2017. En effet, les auteurs du projet
sont conscients de la situation et travaillent à l'amélioration de l'affichage. Il convient également de noter que Vim utilisant GTK3 est un ordre de grandeur plus lent que son homologue GTK2. De cela, nous pouvons conclure que GTK3 crée un retard supplémentaire, et cela se reflète dans tous les autres terminaux qui l'utilisent (Terminator, Xfce4 Terminal et GNOME Terminal).
Cependant, les différences peuvent ne pas être visibles à l'œil nu. Comme l'explique Fatin: «il n'est pas nécessaire d'être conscient du retard pour qu'il ait un effet sur vous.» Fatin met également en garde contre un écart-type: "Toute irrégularité dans la durée du retard (gigue) crée une charge supplémentaire en raison de leur imprévisibilité."

Le graphique ci-dessus est pris sur Debian 9 pure (stretch) avec le
gestionnaire de fenêtres i3 . Cet environnement donne les meilleurs résultats dans les tests de retard. Il s'est avéré que GNOME crée un ping supplémentaire de 20 ms pour toutes les dimensions. Une explication possible à cela est la présence de programmes avec traitement synchrone des événements d'entrée. Fatin cite un exemple
Workrave pour ce cas, qui ajoute un délai en traitant tous les événements d'entrée de manière synchrone. Par défaut, GNOME possède également un gestionnaire de fenêtres
Mutter qui crée un niveau supplémentaire de mise en mémoire tampon, ce qui affecte le ping et ajoute un minimum de 8 millisecondes de retard.

Vitesse de défilement
Le test suivant est le test traditionnel de «vitesse» ou de «bande passante», qui mesure la vitesse à laquelle le terminal peut faire défiler une page, affichant une grande quantité de texte à l'écran. La mécanique du test varie; le test d'origine consistait simplement à générer la même chaîne de texte avec la commande seq. D'autres tests incluent un test de Thomas E. Dickey (le responsable de xterm), qui
télécharge à plusieurs reprises
le fichier terminfo.src . Dans un autre examen des performances du terminal,
Den Luu utilise une chaîne codée en base32 d'octets aléatoires, qui est envoyée au terminal à l'aide de cat. Luu considère qu'un tel test est «aussi inutile qu'on peut l'imaginer» et suggère d'utiliser à la place la réponse du terminal comme indicateur principal. Dickey qualifie également son test de trompeur. Cependant, les deux auteurs reconnaissent que la bande passante de la fenêtre du terminal peut être un problème. Luu a trouvé Emacs Eshell gelé lors de l'affichage de gros fichiers, et Dickie a optimisé le terminal pour se débarrasser de la lenteur visuelle de xtrerm. Par conséquent, il existe encore une raison pour ce test, mais comme le processus de rendu est très différent d'un terminal à l'autre, il peut également être utilisé comme composant de test pour vérifier d'autres paramètres.

Ici, nous voyons que rxvt et st sont en avance sur la concurrence, suivis par le plus récent Alacritty, qui est développé en mettant l'accent sur la vitesse. Viennent ensuite Xfce (la famille VTE) et Konsole, qui fonctionnent presque deux fois plus vite. Le dernier est xterm avec un index cinq fois plus lent que rxvt. Pendant le test, xterm a également ondulé, il était difficile de voir le texte qui passait, même s'il s'agissait de la même ligne. Konsole s'est avéré être rapide, mais parfois c'était «délicat»: l'affichage pendait de temps en temps, montrant le texte partiellement ou ne l'affichant pas du tout. D'autres terminaux affichaient clairement les chaînes, notamment st, Alacritty et rxvt.
Dickie explique que les différences de performances sont liées à la conception de tampons de défilement dans différents terminaux. En particulier, il accuse rxvt et d'autres terminaux de «ne pas suivre les règles générales»:
«Contrairement à xterm, rxvt n'a pas essayé d'afficher toutes les mises à jour. S'il prend du retard, il supprimera certaines mises à jour pour rattraper son retard. Cela a eu un effet plus important sur la vitesse de défilement imaginaire que sur l'organisation de la mémoire interne. Un inconvénient était que l'animation ASCII était quelque peu inexacte. »
Pour corriger cette lenteur apparente de xterm, Dickey suggère d'utiliser la ressource
fastScroll , qui permet à xterm de supprimer certaines mises à jour d'écran afin de suivre le flux. Mes tests confirment que fastScroll améliore les performances et amène xterm au même niveau que rxvt. Ceci, cependant, est une béquille plutôt grossière, comme Dickey l'explique lui-même: "parfois xterm - comme konsole - semble s'arrêter, car il attend un nouvel ensemble de mises à jour d'écran après que certaines d'entre elles ont été supprimées." Dans cet esprit, il semble que d'autres terminaux aient trouvé le meilleur compromis entre vitesse et intégrité d'affichage.
Consommation de ressources
Indépendamment de la pertinence de considérer la vitesse de défilement comme indicateur de performance, ce test vous permet de simuler la charge sur les terminaux, ce qui, à son tour, nous permet de mesurer d'autres paramètres, tels que l'utilisation de la mémoire ou du disque. Les mesures ont été obtenues en exécutant le test
seq spécifié sous la surveillance du processus Python. Il a collecté les données du compteur
getrusage () pour
ru_maxrss , la somme de
ru_oublock et
ru_inblock, et un simple timer.

Dans ce test, ST prend la première place avec la plus petite consommation moyenne de mémoire de 8 Mo, ce qui n'est pas surprenant quand on considère que l'idée principale du projet est la simplicité. Mlterm, xterm et rxvt consomment un peu plus - environ 12 Mo. Alacritty a un autre résultat notable, qui nécessite 30 Mo pour fonctionner. Ensuite, il y a les terminaux de la famille VTE avec des indicateurs de 40 à 60 Mo, ce qui est beaucoup. Une telle consommation peut s'expliquer par le fait que ces terminaux utilisent des bibliothèques de niveau supérieur, par exemple GTK. Konsole vient en dernier avec une énorme consommation de 65 Mo de mémoire lors des tests, bien que cela puisse être justifié par sa très large gamme de fonctions.
Par rapport aux résultats précédents obtenus il y a dix ans, tous les programmes ont commencé à consommer beaucoup plus de mémoire. Auparavant, Xterm nécessitait 4 Mo, mais maintenant - 15 Mo juste pour fonctionner. Rxvt a une augmentation similaire de la consommation, qui nécessite désormais 16 Mo prêts à l'emploi. Le terminal Xfce occupe 34 Mo, soit trois fois plus qu'auparavant, mais le terminal GNOME ne nécessite que 20 Mo. Bien entendu, tous les tests précédents ont été effectués sur une architecture 32 bits. Lors de l'ACV 2012, Rusty Russell a
déclaré qu'il existe de nombreuses raisons plus subtiles qui peuvent expliquer l'augmentation de la consommation de mémoire. Avec tout cela, nous vivons maintenant à une époque où nous avons des gigaoctets entiers de mémoire, donc nous pouvons le gérer d'une manière ou d'une autre.
Néanmoins, je ne peux m'empêcher de penser qu'allouer plus de mémoire à un logiciel aussi fondamental qu'un terminal est un gaspillage de ressources. , «», , - , Linux- ( , ). , . , GNOME Terminal, Konsole, urxvt, Terminator Xfce Terminal Daemon-, , .

-: , , . , VTE (
2010 , ). , , , AES256 GCM (
0.39.2 ). , VTE, …
Conclusion
, VTE , , . , VTE- Daemon-, . , , , - , . VTE (), GNOME. , VTE . , Linux , . - . , xterm mlterm 10 , .
, - Linux . , . , Wayland : Typometer, , , Wayland — . , Wayland , X.org, , - .