web-dev-qa-db-fra.com

Pourquoi `echo -e" \\\ SOME_TEXT "` affiche-t-il une seule barre oblique inverse?

Quelqu'un pourrait-il expliquer ce qui se passe dans les coulisses d'un personnage échappé dans un shell Linux? J'ai essayé ce qui suit et j'ai beaucoup cherché sur Google, sans succès pour comprendre ce qui se passe (et comment):

root@sv01:~# echo -e "\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\\ Hello!"
\\\ Hello!
root@sv01:~# echo -e "\n Hello!"

 Hello!
root@sv01:~# echo -e "\\n Hello!"

 Hello!
root@sv01:~# echo -e "\\\n Hello!"
\n Hello!

Je suis totalement perdu là-bas, alors par exemple, pourquoi trois barres obliques inverses donnent-elles une seule barre oblique inversée? J'attendrais: les deux premiers seront échappés à un, le troisième ne trouvera rien pour échapper, donc il restera une barre oblique (ligne dans la première expérience), mais ce qui se passe, c'est que le troisième est en train de disparaître.
Pourquoi je reçois une barre oblique inverse de quatre \\\\ Hello? Je m'attendrais à ce que chaque paire donne une barre oblique inversée -> deux barres obliques inverses.

Et pourquoi ai-je besoin de trois barres obliques inverses dans le dernier cas pour échapper à\n? que se passe-t-il en arrière-plan pour s'échapper? et en quoi est-il différent du cas \\n?

J'apprécie toute explication de ce qui se passe dans les lignes précédentes.

18
Mohammed Noureldin

En effet, bash et echo -e sont combinés. De man 1 bash

Une barre oblique inverse non-citée (\) est le caractère d'échappement. Il conserve la valeur littérale du caractère suivant, à l'exception de <newline>. […]

Le fait de placer des caractères entre guillemets doubles préserve la valeur littérale de tous les caractères compris entre guillemets, à l'exception de $, `, \, […] La barre oblique inverse ne conserve sa signification particulière que lorsqu'elle est suivie de l'un des caractères suivants: $,`, " , \ ou <newline>.

Le fait est que la double barre oblique inversée n’est pas toujours spéciale.

Il existe différentes implémentations de echo en général, il s'agit d'une commande intégrée dans bash; la chose importante ici est ce comportement:

Si -e est en vigueur, les séquences suivantes sont reconnues:
\\
barre oblique inverse
[…]
\n
nouvelle ligne

Maintenant nous pouvons décoder:

  1. echo -e "\ Hello!" - rien de spécial à bash, rien de spécial à echo; \ reste.
  2. echo -e "\\ Hello!" - le premier \ dit bash pour traiter le second \ littéralement; echo obtient \ Hello! et agit comme ci-dessus.
  3. echo -e "\\\ Hello!" - le premier \ dit bash pour traiter le second \ littéralement; echo obtient \\ Hello! et (à cause de -e), il reconnaît \\ en tant que \.
  4. echo -e "\\\\ Hello!" - le premier \ dit bash pour traiter le second \ littéralement; le troisième dit la même chose à propos du quatrième; echo obtient \\ Hello! et (à cause de -e), il reconnaît \\ en tant que \.
  5. echo -e "\\\\\ Hello!" - le premier \ dit bash pour traiter le second \ littéralement; le troisième dit la même chose à propos du quatrième; le dernier n'est pas spécial; echo obtient \\\ Hello! et (à cause de -e), il reconnaît le \\ initial en tant que \, le dernier \ reste intact.

Etc. Comme vous pouvez le constater, jusqu'à quatre barres obliques inverses consécutives donnent un résultat. C'est pourquoi il en faut au moins neuf pour en obtenir trois. 9 = 4 + 4 + 1.

Maintenant avec \n:

  1. echo -e "\n Hello!" - il n'y a rien de spécial à bash, echo obtient la même chaîne et (à cause de -e), il interprète \n comme une nouvelle ligne.
  2. echo -e "\\n Hello!" - bash interprète \\ en tant que \; echo obtient \n Hello! et le résultat est le même que ci-dessus.
  3. echo -e "\\\n Hello!" - bash interprète le \\ initial en tant que \; echo obtient \\n Hello! et (à cause de -e), il interprète \\ comme un \ littéral qui doit être imprimé.

Les résultats seraient différents avec ' au lieu de " (en raison d'un comportement bash différent) ou sans -e (comportement echo différent).

28
Kamil Maciorowski