====== Écrire le caractère d'échappement ESC =====
* Objet : Écrire le caractère d'échappement en ligne de commande ou dans éditeur de texte.
* Niveau requis : {{tag>débutant}}
* Pour aller vers : {{tag>avisé}}
* Commentaires : Pour l'interpréteur bash (zsh aussi) et les éditeurs vi, emacs et nano.
* Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-)
* Suivi : {{tag>en-chantier à-tester}}
* Création par [[user>agp91]] le 21/06/2024
* Testé par <...> le <...> FIXME
* Commentaires sur le forum : [[https://debian-facile.org/viewtopic.php?pid=415907| Lien vers le forum concernant ce tuto]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))
**Nota :**
Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli !
===== Introduction =====
**Le caractère d’échappement**, produit par la touche ESC,\\
Permet de __s’échapper__ d'un flux texte...\\
Pour s'adresser au terminal((Un **terminal** est un appareil ou son émulation logicielle, qui permet de communiquer avec un système informatique. Il dispose généralement au moins, d'une entrée pour envoyer des informations au système (par exemple un clavier). Et d'une sortie, pour que le système puisse aussi nous informer (par exemple un écran).)) (une console virtuelle((Une **[[doc:systeme:console|console]] virtuelle** est l'un des multiplexages du terminal intégré au (/émulé par le) noyau Linux.)) ou un terminal fenêtre((Un **[[doc:systeme:terminal|terminal]] fenêtre** est un terminal émulé en espace utilisateur, affiché par le système graphique. C'est le terminal obtenu dans une fenêtre, sous un environnement graphique.))), utilisé par une interface de communication en mode texte((Une **interface de communication en mode texte** permet d'interagir textuellement avec le système. Elle est constituée d'un terminal (l'entrée et la sortie) et par exemple d'un interpréteur de commande.)).
Le caractère d’échappement introduit (permet de constituer) les __séquences d'échappement__,\\
Qui insérées dans un flux texte, permettent d'envoyer des codes de formatage texte, à la sortie du terminal (par exemple l'écran).
Le caractère d'échappement ESC est un caractère de contrôle((Un **caractère de contrôle** est un caractère qui opère un contrôle, pour naviguer dans du texte, mettre en page ou éditer du texte. Ce sont des caractères non-imprimables (qui ne disposent pas de symbole graphique). Ils sont représentés par des séquences de simples caractères imprimables. [[https://fr.wikipedia.org/wiki/Caract%C3%A8re_de_contr%C3%B4le|(fr) Caractère de contrôle (wikipedia.org)]])) non imprimable,\\
Il est le 27em caractère du code ASCII((Le **code ASCII** (American Standard Code for Information Interchange) est une norme qui encode les caractères, en les représentant par un identifiant numérique. Le code ASCII dispose de 128 caractères (de 0 à 127). Les 32 premiers (de 0 à 31) et le dernier (127) sont des caractères de contrôle. Les 96 autres (de 32 à 126) sont les caractères de l'alphabet (minuscules et majuscules), les chiffres, ceux de la ponctuations et autres caractères spéciaux. [[https://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange|(fr) American Standard Code for Information Interchange (wikipedia.org)]])) (033 en octal, (0)xb1 en hexadécimal).\\
Non-imprimable, il ne dispose pas d'un caractère textuel (graphique), pour le dessiner (l'écrire),\\
Empêchant ainsi, de le manipuler comme un caractère imprimable (par exemple ''a'') dans une chaîne de caractère.
==== Présentation ====
Ce tuto propose d'écrire le caractère d'échappement,\\
D'expliquer sa représentation textuelle.
De l'écrire,
* Directement au clavier : Dans la ligne commande de ''bash'' ou dans un éditeur de texte (''vim'', ''emmacs'' ou ''nano'').
* Par l'interprétation de l'interpréteur de commande (ici ''bash'').
===== Saisi au clavier =====
Pour écrire le caractère d'échappement depuis le clavier,\\
Dans la ligne de commande ou dans un éditeur de texte,\\
Nous devons utiliser les combinaisons de touches suivantes :
==== Depuis la ligne de commande ====
C-V puis ESC
^[
__Rappel__ : Le caractère d'échappement est un caractère de contrôle non imprimable.\\
En ce sens, il ne dispose pas de caractère textuel pour être affiché.\\
\\
Pour indiquer sa présence (car nous avons besoin de le visualisé),\\
Il est utilisé le motif **''^[''**, composé de deux caractères : ''^'' et ''[''.\\
\\
Qui évidement ne sont pas le caractère d'échappement. Mais des simples caractères imprimables.
Saisir au clavier (ou copier/coller) ''^['', ne formera pas le caractère d'échappement.
==== Avec un éditeur de texte ====
| **Écrire le caractère d'échappement** ||
^ Éditeurs ^ Combinaisons des touches |
| **[[doc:editeurs:vim:vim|vim]]** | C-V puis ESC |
| **[[doc:editeurs:emacs|emacs]]** | C-Q puis ESC |
| **[[doc:editeurs:nano|nano]]** | ESC-V puis ESC |
===== Retourné par interprétation =====
Lors de l'interprétation de l'interpréteur de commande ''bash'',\\
Les [[atelier:chantier:bash:les-caracteres-de-controle-proteges-par-contre-oblique| caractères de contrôle protégés par contre oblique]] :
* **''\e''** ou **''\E''**,
* Ou **''\033''** (en octal),
* Ou **''\x1b''** (en hexadécimal),
Et
* **''\c[''**
Sont remplacés par le caractère d’échappement.
Le caractère **''$''** et les commandes **''echo -e''** et **''printf''**,\\
Permettent de remplacer les __caractères de contrôle protégés par contre oblique__ par les __caractères de contrôle__ qu'ils représentent.
==== Avec le caractère $ ====
L'interprétation de ''bash'' réalise le remplacement des caractères de contrôle protégés par contre oblique,\\
Avec le mécanisme de protection **''$''''**.
Voir : ''man bash'' section PROTECTIONS.
echo $'\e' >/tmp/df
ou
echo $'\c[' >/tmp/df
L'option ''-v'' de la commande **''cat''**((La commande **[[doc:systeme:cat|cat]]** permet d'afficher le contenu de fichier sur la sortie standard. [[https://fr.manpages.org/cat|Manuel (fr) cat (1) : Concaténer des fichiers et les afficher sur la sortie standard (manpage.org)]])) permet d'afficher les caractères non-imprimables.\\
(Sauf les sauts de ligne et les tabulations horizontales).\\
Il sont alors représentés par une séquence de caractère débutant soit par ''^'', soit par ''M-''.\\
\\
L'option ''-t'' permet de représenter aussi les tabulations horizontales.\\
\\
Sauf pour les exceptions des caractères de tabulation horizontale et de saut de ligne (voir ci-dessus).\\
Que se soit avec l'option ''-v'' ou ''-t'', les caractères de contrôles sont affichés par leurs représentations textuels.\\
Ainsi passés au terminal, ce dernier ne les reconnaît plus comme caractères de contrôle. Et leurs contrôles ne sont pas appliqués.
cat -v /tmp/df
^[
----
Le caractère ''$'' introduit aussi le développement des paramètres (et variables).
L'opérateur de transformation de paramètre ''E'' permet lors du développement des paramètres, le remplacement des caractères de contrôle protégés par contre oblique.
Voir : ''man bash'' section DÉVELOPPEMENTS > Développement des paramètres > Transformation de paramètre.
Ainsi pour la variable ''var'', avec :\\
''var=\\e'' ou ''var='\e''' ou ''var="\e"'' ou ''var=$'\e''' ou ''var=$'\c['''
var=\\e
echo ${var@E} >/tmp/df
cat -v /tmp/df
^[
unset var # Destruction de la variable var
==== Avec la commande echo ====
L'option ''-e'' de la commande **''echo''**, permet le remplacement des caractères de contrôle protégés par contre oblique.
echo -e "\e" >/tmp/df
cat -v /tmp/df
^[
==== Avec la commande printf ====
La commande **''printf''**, réalise le remplacement des caractères protégés par contre oblique\\
* Dans __l'argument format__ (le premier qui ne soit pas une option).
* Dans un argument à afficher, lorsqu’il est traité par le format ''%b'' (placé dans __l'argument format__).
printf "\e" >/tmp/df
Ou
printf %b "\e" >/tmp/df
cat -v /tmp/df
^[
==== Usages ====
Avec les commandes **''echo -e''** et **''printf''** :\\
Les caractères protégés par contre oblique s'utilisent, dans une chaîne de caractère protégée entre **guillemets doubles** (''"'').\\
\\
Pour ne pas utiliser la protection des guillemets doubles, les caractères protégés par contre oblique, doivent être protégés par le caractère de protection ''\'' (contre oblique). Par exemple : **''\\e''**.
Écrire le caractère d'échappement, ne suffit pas pour créer une séquence d'échappement.\\
Le **caractère d'échappement** doit être suivit du caractère ''**[**'' (crochet ouvrant) et du **code de la séquence**.
Pour une console virtuelle ou un terminal fenêtre, la séquence d'échappement notée **''^[[1m''** met en gras.\\
Et **''^[[0m''** retourne au format normal.\\
Donc sous ''bash'' :
La séquence '';\Entrée''\\
Permet d'écrire une ligne de commande qui comporte plusieurs commandes, sur plusieurs lignes, une ligne par commande.\\
''Bash'' ne voyant toujours qu'une seule ligne.\\
La protection de Entrée par le caractère de protection ''\'', annule le saut de ligne.\\
\\
Voir : [[atelier:chantier:bash:les-caracteres-de-protection#le_caractere_de_protection|Le caractère de protection \]].
echo $'\e[1m'Debian Facile $'\e[0m' ;\
echo -e "\e[1mMouuai facile\e[0m"
> **Debian Facile**\\ **Mouuai facile**
printf "\e[1mDebian Facile\e[0m\n" >/tmp/df
printf %b "\e[1mMouuai facile\e[0m\n" >>/tmp/df
printf \\e[1m%s\\e[0m\\n Debian Facile >> /tmp/df
cat /tmp/df
> **Debian Facile\\ Mouuai facile\\ Debian\\ Facile**
cat -v /tmp/df
^[[1mDebian Facile^[[0m
^[[1mMouuai facile^[[0m
^[[1mDebian^[[0m
^[[1mFacile^[[0m
Si le fichier ''/tmp/df'' n'est pas copié ailleurs, il sera supprimé durant l'arrêt du système.
rm -v /tmp/df
'/tmp/df' supprimé
===== Conclusions =====
:-P Avant de partir, un dernier pour la route :
echo "^[[1;37;44mD^[[7mebian^[[27m F^[[7macile^[[0m"
LOL __Petit rappel__ :\\
Pour que cela fonctionne, il faut changer toutes les séquences des caractères ''^['' par :
* Soit des véritables caractères d'échappement, saisis au clavier avec C-V puis ESC.
Lorsque nous utilisons le clavier pour écrire le caractère d'échappement ESC,\\
\\
L'usage du caractère de contrôle protégé par contre oblique ''\e'' et de son interprétation, ne sont plus utiles.\\
Cela permet de s’affranchir de l'option ''-e'' de la commande ''echo'' ou du format ''%b'' de la commande ''printf''.\\
\\
Le caractère d'échappement (saisi au clavier) n'est pas un caractère interprété par ''bash'',\\
Mais reconnu par le terminal utilisé (une console virtuelle ou un terminal fenêtre).\\
Pour ''bash'', il s'agit d'un simple caractère (de contrôle, non-imprimable).\\
Il n'a donc pas besoin d'être protégé, ni par le caractère de protection ''\'', ni par l'encadrement des guillemets simples ou doubles.\\
Et sa protection ne l’empêche pas d'être le caractère d'échappement.\\
\\
Il permet aussi, d'être écrit dans un éditeur de texte interactif.
* Soit par le caractère de contrôle protégé par contre oblique ''\e'', en utilisant ''printf'' ou l'option ''-e'' avec la commande ''echo''.
echo -e "\e[1;37;44mD\e[7mebian\e[27m F\e[7macile\e[0m"
Cette écriture peut être partagée, en étant simplement recopiée ou en étant copiée/collée.\\
Mais elle nécessite d'être interprétée par l'interpréteur de commande.
{{ /file-Rc24957b2e3e1f616bf3f7c1277040dbc.png?nolink | }}
----
Voir :
* [[atelier:chantier:bash:les-caracteres-de-protection|Bash : Les caractères de protection]]
* [[atelier:chantier:bash:les-caracteres-de-controle-proteges-par-contre-oblique|Bash : Les caractères de contrôle protégés par contre oblique]]
* [[atelier:chantier:les-sequences-d-echappement|Les séquences d'échappement]]