Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente | Prochaine révision Les deux révisions suivantes | ||
atelier:chantier:terminaux-et-consoles-explications [13/06/2023 21:30] agp91 Ajout dans la sous-section [Tuto/Le type $TERM] |
atelier:chantier:terminaux-et-consoles-explications [13/06/2023 22:25] agp91 [Tuto] |
||
---|---|---|---|
Ligne 966: | Ligne 966: | ||
Si oui, alors le prompt (définit dans la variable **PS1**) dispose des séquences d'échappement de colorisation.\\ | Si oui, alors le prompt (définit dans la variable **PS1**) dispose des séquences d'échappement de colorisation.\\ | ||
Sinon, il est définit sans. | Sinon, il est définit sans. | ||
+ | |||
+ | ==== Configuration avec stty ==== | ||
+ | |||
+ | La commande **stty** (set tty) permet d'afficher ou de modifier la configuration d'un terminal. | ||
+ | |||
+ | L'option **-a** (ou **<nowiki>--all</nowiki>**) de la commande **stty** permet de retourner la configuration du terminal utilisé : | ||
+ | |||
+ | <code user> | ||
+ | stty -a | ||
+ | </code><code> | ||
+ | speed 38400 baud; rows 24; columns 80; line = 0; | ||
+ | intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; | ||
+ | eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; | ||
+ | werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0; | ||
+ | -parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts | ||
+ | -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff | ||
+ | -iuclc -ixany -imaxbel iutf8 | ||
+ | opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 | ||
+ | isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt | ||
+ | echoctl echoke -flusho -extproc | ||
+ | </code> | ||
+ | |||
+ | La première ligne\\ | ||
+ | ''speed 38400 baud; rows 24; columns 80; line = 0;''\\ | ||
+ | Indique : | ||
+ | |||
+ | * La vitesse de transition de l'entrée et de la sortie du terminal. | ||
+ | * Le nombre de ligne et de colonne de la sortie du terminal. | ||
+ | * Et le numéro de la discipline de ligne. | ||
+ | |||
+ | Puis nous trouvons la configuration des caractères de contrôle :\\ | ||
+ | ''intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;''.\\ | ||
+ | Ainsi configuré : | ||
+ | |||
+ | * <key>C</key>+<key>c</key> permet d’arrêter l'exécution du processus du premier plan. Ou de mettre fin à l'écriture d'une ligne de commande, sans l'interprétée. | ||
+ | * <key>C</key>+<key>d</key>, envoie le signal de fin de fichier. Il indique la fin d'un flux. S'il est utilisé à l'invite (au prompt) et qu'aucune saisie ne soit effectuèe, le signal est envoyé à l'entrée du terminal. Ce qui a pour effet d'indiquer la fin du flux de l'entrée standard et donc de fermer le terminal. Puisque le terminal, sans son entrée n'a plus aucun intérêt. | ||
+ | * <key>C</key>+<key>z</key>, suspend l'exécution du processus du premier plan, pour le placé en arrière plan. | ||
+ | * <key>C</key>+<key>?</key>, efface le caractère précédent le curseur (équivalent à <key>← Retour Arrière</key>) | ||
+ | * <key>C</key>+<key>u</key> "coupe" du début de la ligne, jusqu'au curseur. (La ligne entière, si le curseur est en fin de ligne.) | ||
+ | * <key>C</key>+<key>w</key> "coupe" du début d'un mot, jusqu'au curseur. (Le mot entier, si le curseur est à la fin du mot.) | ||
+ | * <key>C</key>+<key>r</key>, effectue une recherche dans l'historique. | ||
+ | |||
+ | <note> | ||
+ | La commande **stty** ne permet pas de configurer tout les caractères de contrôle disponibles dans un terminal.\\ | ||
+ | \\ | ||
+ | En voici d'autres très utiles :\\ | ||
+ | \\ | ||
+ | * <key>C</key>+<key>a</key> : Déplace le curseur en début de ligne (équivalent à <key>Début</key>). | ||
+ | * <key>C</key>+<key>e</key> : Déplace le curseur en fin de ligne (équivalent à <key>Fin</key>). | ||
+ | * <key>C</key>+<key>k</key> : Coupe tout ce qui est après le curseur. | ||
+ | * <key>C</key>+<key>y</key> : Colle (yank) ce qui a été coupé. | ||
+ | </note> | ||
+ | |||
+ | Vient en suite les paramètres configurables. Tous les paramètres disponibles sont donnés. Ceux préfixés par le signe négatif (**-**) sont désactivés. | ||
+ | |||
+ | Les paramètres de contrôle :\\ | ||
+ | ''-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts''. | ||
+ | |||
+ | Les paramètres d'entrée :\\ | ||
+ | ''-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel iutf8''. | ||
+ | |||
+ | Les paramètres de sortie :\\ | ||
+ | ''opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0''. | ||
+ | |||
+ | Et les paramètres locaux :\\ | ||
+ | ''isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc''. | ||
+ | |||
+ | Pour une description des paramètres, voir la page du manuel de la commande **stty**(([[https://fr.manpages.org/stty|(fr.manpages.org) stty (1) : Modifier et afficher la configuration de la ligne de terminal]])) avec la commande ''man stty''. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Sans option la commande **stty** retourne la vitesse de transmission, le numéro de la discipline de ligne. Et la différence entre une configuration saine (sane en anglais) et la configuration actuelle. | ||
+ | |||
+ | <code user> | ||
+ | stty | ||
+ | </code><code> | ||
+ | speed 38400 baud; line = 0; | ||
+ | -brkint -imaxbel iutf8 | ||
+ | </code> | ||
+ | |||
+ | Nous remarquons qu'à l'ouverture d'un terminal, sa configuration à déjà été modifiée. | ||
+ | |||
+ | * **-brkint**, indique que le paramètre **brkint** (le « break » provoque un signal d'interruption) est désactivé. | ||
+ | * **-imaxbel**, indique que le paramètre **imaxbel** (émettre un bip sonore et ne pas vider un tampon d'entrée plein lors de l'arrivée d'un caractère) est désactivé. | ||
+ | * Le paramètre **iutf8** (supposer que les caractères d'entrées sont codés en UTF-8) est activé. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | L'option **-g** (ou **--save**) de la commande **stty** retourne la configuration actuel du terminal dans un format compréhensible par **stty**. | ||
+ | |||
+ | <code user> | ||
+ | stty -g | ||
+ | </code><code> | ||
+ | 4500:5:bf:8a3b:3:1c:7f:15:4:0:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 | ||
+ | </code> | ||
+ | |||
+ | C'est très pratique pour sauvegarder la configuration du terminal, | ||
+ | * Dans un fichier avec ''stty -g > fichier'' | ||
+ | * Restauré avec ''stty $(cat fichier)'' | ||
+ | * Ou dans une variable avec ''var=$(stty -g)'' | ||
+ | * Restauré avec ''stty $var'' | ||
+ | |||
+ | Sauvegardons notre configuration dans la variable **stty** | ||
+ | |||
+ | <code user> | ||
+ | stty=$(stty -g) | ||
+ | echo stty=$stty | ||
+ | </code><code> | ||
+ | stty=4500:5:bf:8a3b:3:1c:7f:15:4:0:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 | ||
+ | </code> | ||
+ | |||
+ | Voila qui est bien fait :-)\\ | ||
+ | Jouons un peu avec les paramètres. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Le paramètre de sortie **onlcr** indique au terminal de convertir un saut de ligne en un saut ligne + un retour chariot.\\ | ||
+ | ... Désactivons le : | ||
+ | |||
+ | <code user> | ||
+ | stty -onlcr | ||
+ | </code> | ||
+ | |||
+ | Demandons l'affichage de la différence avec une configuration saine : | ||
+ | |||
+ | <code user> | ||
+ | stty | ||
+ | </code><code> | ||
+ | speed 38400 baud; line = 0; | ||
+ | -brkint -imaxbel iutf8 | ||
+ | -onlcr | ||
+ | </code> | ||
+ | |||
+ | 8-O Le saut de ligne ne dispose plus de retour chariot.\\ | ||
+ | Réactiver le paramètre permet de revenir à l'état normal. | ||
+ | |||
+ | <code user> | ||
+ | stty onlcr | ||
+ | </code> | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Continuons à jouer et grimpons d'un niveau en désactivant le paramètre local **echo**. | ||
+ | |||
+ | <code user> | ||
+ | stty -echo | ||
+ | </code> | ||
+ | |||
+ | Puis affichons la différence avec la configuration saine : | ||
+ | |||
+ | <code user> | ||
+ | stty | ||
+ | </code><code> | ||
+ | speed 38400 baud; line = 0; | ||
+ | -brkint -imaxbel iutf8 | ||
+ | -echo | ||
+ | </code> | ||
+ | |||
+ | LOL La saisie ce fait en aveugle.\\ | ||
+ | Le paramètre **echo** fait l'affichage des caractères en entrée. Alors le désactiver...\\ | ||
+ | Réactiver le paramètre permet de revenir à l'état normal. | ||
+ | |||
+ | <code user> | ||
+ | stty echo | ||
+ | </code> | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Les paramètres spéciaux **rows** et **cols** permettent d'indiquer au noyau le nombre de ligne et de colonne que dispose le terminal.\\ | ||
+ | |||
+ | Commençons par récupérer les valeurs actuelles, retournées par le paramètre **size** : | ||
+ | |||
+ | <code user> | ||
+ | stty size | ||
+ | </code><code> | ||
+ | 24 80 | ||
+ | </code> | ||
+ | <code user> | ||
+ | s=$(stty size) # Récupère le retour de stty size dans la variable s | ||
+ | |||
+ | r=${s% *} # Mémorise le nombre de ligne dans la variable r | ||
+ | c=${s#* } # Mémorise le nombre de colonne dans la variable c | ||
+ | |||
+ | echo "Nombre de ligne : $r" | ||
+ | echo "Nombre de colonne : $c" | ||
+ | |||
+ | unset s # Destruction de la variable s | ||
+ | </code><code> | ||
+ | Nombre de ligne : 24 | ||
+ | Nombre de colonne : 80 | ||
+ | </code> | ||
+ | |||
+ | Et modifions en le nombre : | ||
+ | |||
+ | <code user> | ||
+ | stty rows 10 cols 40 | ||
+ | man stty | ||
+ | </code><code> | ||
+ | STTY(1Commandes de l'utilisateuSTTY(1) | ||
+ | |||
+ | NOM | ||
+ | stty - Modifier et afficher la | ||
+ | configuration de la ligne de | ||
+ | terminal | ||
+ | |||
+ | SYNOPSIS | ||
+ | stty [-F PÉRIPHÉRIQUE | | ||
+ | line 1 (press h for help or q to quit) | ||
+ | </code> | ||
+ | |||
+ | Appuyons sur la touche <key>q</key> pour quitter. | ||
+ | Et restaurons les valeurs initiales : | ||
+ | |||
+ | <code user> | ||
+ | stty rows $r cols $c | ||
+ | |||
+ | unset r c # Destruction des variables r et c | ||
+ | </code> | ||
+ | |||
+ | ---- | ||
+ | |||
+ | La commande **stty** dispose de paramètre combiné (qui regroupent plusieurs paramètres en un seul). | ||
+ | |||
+ | Par exemples :\\ | ||
+ | Le paramètre **raw** permet de passer le terminal en mode brut.\\ | ||
+ | La __discipline de ligne__ passe alors en __mode caractère__ et aucune modification n'est appliquée ni à l'entrée, ni à la sortie. | ||
+ | |||
+ | <code user> | ||
+ | stty raw | ||
+ | stty | ||
+ | </code><code> | ||
+ | speed 38400 baud; line = 0; | ||
+ | min = 1; time = 0; | ||
+ | -brkint -icrnl -imaxbel | ||
+ | -opost | ||
+ | -isig | ||
+ | -icanon | ||
+ | </code> | ||
+ | |||
+ | Remarquons que le retour chariot n'est plus ajouté au saut de ligne. Cela n'est pas obtenu comme plus haut, par la négation du paramètre **onlcr** (**-onclcr**). Mais par la négation du paramètre **opost** (effectuer un post-traitement de la sortie). | ||
+ | |||
+ | Pour restaurer notre terminal dans son état d'origine, nous pouvons utiliser le paramètre **sane** (traduction : saine) avec les paramètres donnés plus haut avec la commande **stty** sans option ni paramètre. | ||
+ | |||
+ | <code user> | ||
+ | stty sane -brkint -imaxbel iutf8 | ||
+ | </code> | ||
+ | |||
+ | <note> | ||
+ | Nous aurions pu aussi utiliser la sauvegarde que nous avons réaliser dans la variable **stty**\\ | ||
+ | \\ | ||
+ | <code user> | ||
+ | stty $stty | ||
+ | </code> | ||
+ | </note> | ||
+ | |||
+ | Le mode brut (raw) empêche aussi l'utilisation de certaines touches de contrôle.\\ | ||
+ | Comme par exemple le caractère d'interruption (<key>C</key>+<key>c</key>) qui termine le processus du premier plan. | ||
+ | |||
+ | Pour mettre cela en évidence, nous allons utiliser une boucle qui va afficher les secondes pendant 10 secondes.\\ | ||
+ | Pendant son déroulement nous l'interrompons en appuyant sur les touches <key>C</key>+<key>c</key>. | ||
+ | |||
+ | <code user> | ||
+ | (for t in {1..10}; do echo $t; sleep 1; done) | ||
+ | </code><code> | ||
+ | 1 | ||
+ | 2 | ||
+ | 3 | ||
+ | ^C | ||
+ | </code> | ||
+ | |||
+ | <note> | ||
+ | Nous exécutons notre boucle **for** entre parenthèse **(**...**)**, pour l'exécuter dans processus fils.\\ | ||
+ | Ainsi son processus se termine en même temps que la boucle.\\ | ||
+ | Et la variable **t** n'existe pas, (puisque qu'elle à été initialisée dans le processus fils). | ||
+ | </note> | ||
+ | |||
+ | ... Cela fonction, testons en mode brut. | ||
+ | |||
+ | <code user> | ||
+ | stty raw | ||
+ | (for t in {1..10}; do echo $t; sleep 1; done) | ||
+ | </code><code> | ||
+ | 1 | ||
+ | 2 | ||
+ | 3 | ||
+ | ^C4 | ||
+ | 5 | ||
+ | 6 | ||
+ | ^C7 | ||
+ | 8 | ||
+ | 9 | ||
+ | 10 | ||
+ | </code> | ||
+ | |||
+ | Cela ne fonctionne plus.\\ | ||
+ | C'est le paramètre local **-isig** (la négation de **isig**), apporté par le paramètre combiné **raw** qui fait cela. | ||
+ | |||
+ | Restaurons notre terminal avec sa configuration d'origine. | ||
+ | |||
+ | <code user> | ||
+ | stty $stty | ||
+ | |||
+ | unset stty # Destruction de la variable stty | ||
+ | </code> | ||
+ | |||
+ | Nous allons maintenant nous intéresser aux terminaux virtuels. | ||