Niveau :      
Résumé : tty ; infocmp

Comment fonctionne un terminal ?

D'un point de vue unix, un terminal est un fichier, comme tout le reste. C'est à travers ce fichier qu'une application communique avec son terminal.

Quel est ce fichier ?

Chaque type de terminal correspond à un fichier dans /dev avec un nom différent, ainsi les terminaux linux seront dans /dev/tty*, les terminaux physiques seront plutôt accédés par le port série /dev/ttyS*, les terminaux virtuels ancienne génération utiliseront /dev/tty** et les terminaux virtuels plus récents utiliseront plutot /dev/pts/* . Pour savoir sur quel terminal est connecté votre ligne de commande tapez :

$ tty

Et côté "serveur" du terminal virtuel ?

Cette question ne s'applique qu'aux terminaux virtuels tty** et pts/*, ceux-ci ont en effet un pendant serveur effectuant l'affichage réel du contenu du terminal (dans une fenêtre par exemple). Pour les tty** la partie serveur correspondante est /dev/pty** et pour les pts/* il s'agit de /dev/ptmx.

Comment communique-t-on avec un terminal ?

En lui envoyant tout simplement des caractères. L'application qui a connecté votre shell à votre terminal a simplement affecté stdout et stderr à l'entrée et stdin à la sortie du fichier en question. Si vous envoyez un 'A', un A sera imprimé dans le terminal à la position du curseur. Là où ça se complique, c'est qu'il est possible de faire beaucoup plus de choses que d'afficher des caractères. Les caractères non affichables correspondent en fait à des instructions pour les terminaux et c'est grâce à ces instructions qu'on peut mettre des couleurs ou afficher des boites de dialogues dans des terminaux.

Comment connaître ces caractères spéciaux ?

Là où ça se complique encore plus, c'est que chaque type de terminal utilise des séquences différentes et a des options de fonctionnement différentes. Ceci s'explique par la quantité de technologies différentes au début des terminaux. Et pourtant ce problème est resté avec les terminaux virtuels. C'est pourquoi il a été créé une base de données avec les caractéristiques de ceux-ci. C'est termcap, pour savoir à quoi elle ressemble pour votre terminal en cours :

$ infocmp -C

Termcap étant devenue une base de données un peu grosse, sa structure et sa syntaxe ont été modifiées et c'est devenu terminfo. pour savoir à quoi elle ressemble pour votre terminal en cours :

$ infocmp -I

Comme vous voyez c'est un bazar infâme, et je ne vous détaille même pas sa syntaxe.

Mais comment font les logiciels normaux ?

Ils utilisent ncurses. Ncurses est un remplaçant de curses qui vous fournit des fonctions de haut niveau permettant d'éviter de toucher aux bases terminfo et termcap. Ainsi vous pouvez appeler une fonction directement pour changer une couleur ou tracer une ligne dans le terminal. Allez un petit exemple pour la route :

$ dialog --infobox "Bonjour" 10 30