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.
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:
echo -e "\ Hello!"
- rien de spécial à bash
, rien de spécial à echo
; \
reste.echo -e "\\ Hello!"
- le premier \
dit bash
pour traiter le second \
littéralement; echo
obtient \ Hello!
et agit comme ci-dessus.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 \
.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 \
.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
:
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.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.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).