Quelqu'un pourrait-il expliquer ce qui se passe dans les coulisses des personnages qui s'échappent dans le shell Linux? J'ai essayé ce qui suit et j'ai beaucoup cherché sur Google, sans réussir à 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 ne donnent-elles qu'une seule barre oblique inverse? Je m'attendrais à ce que les deux premiers soient échappés à un, le troisième ne trouverait rien à échapper donc il resterait une barre oblique (ligne dans la première expérience), mais ce qui se passe, c'est que le troisième est juste disparaît.
Pourquoi je reçois une barre oblique inverse sur quatre \\\\ Hello
? Je m'attends à ce que chaque paire donne une barre oblique inverse -> deux barres obliques inverses.
Et pourquoi ai-je besoin de trois barres obliques inverses dans le dernier cas pour m'échapper \ n? que se passe-t-il en arrière-plan de s'échapper pour l'obtenir? et en quoi est-ce différent du \\n
cas?
J'apprécie toute explication de ce qui se passe dans les lignes précédentes.
echo -e
le comportement n'est de toute façon pas défini par les normes - voir pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html . La sortie est complètement définie par l'implémentation s'il y a une barre oblique inverse littérale n'importe où dans les entrées, et la seule option autorisée est-n
(ce qui signifie qu'une implémentation conforme aux normes aura uneecho -e
impression-e
sur sa sortie).echo -e
n'est pas sûr:echo
se comportera conformément à la norme si les deux optionsposix
etxpg_echo
les options d'exécution sont activées, ou si elles sont compilées avec des options de construction équivalentes. La pratique sécuritaire consiste à utiliser à laprintf
place - voir les sections UTILISATION DE L'APPLICATION et JUSTIFICATION du lien ci-dessus décrivant comment faireprintf
agir en remplacementecho
.Réponses:
C'est parce que
bash
etecho -e
combiné. Deman 1 bash
Le fait est que la barre oblique inverse entre guillemets n'est pas toujours spéciale.
Il existe différentes implémentations de
echo
en général, c'est une fonction intégréebash
; l'important ici est ce comportement:Maintenant, nous pouvons décoder:
echo -e "\ Hello!"
- rien de spécial pourbash
, rien de spécial pourecho
;\
reste.echo -e "\\ Hello!"
- le premier\
ditbash
de traiter le second\
littéralement;echo
obtient\ Hello!
et agit comme ci-dessus.echo -e "\\\ Hello!"
- le premier\
ditbash
de traiter le second\
littéralement;echo
obtient\\ Hello!
et (à cause de-e
) il reconnaît\\
comme\
.echo -e "\\\\ Hello!"
- le premier\
ditbash
de traiter le second\
littéralement; le troisième en dit autant du quatrième;echo
obtient\\ Hello!
et (à cause de-e
) il reconnaît\\
comme\
.echo -e "\\\\\ Hello!"
- le premier\
ditbash
de traiter le second\
littéralement; le troisième en dit autant du quatrième; le dernier n'est pas spécial;echo
obtient\\\ Hello!
et (à cause de-e
) il reconnaît l'initiale\\
comme\
, la dernière\
reste intacte.Etc. Comme vous pouvez le voir, jusqu'à quatre barres obliques inverses consécutives donnent un résultat. C'est pourquoi vous en avez besoin (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écialbash
, 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\\
comme\
;echo
obtient\n Hello!
et le résultat est le même que ci-dessus.echo -e "\\\n Hello!"
-bash
interprète l'initiale\\
comme\
;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'unbash
comportement différent ) ou sans-e
(echo
comportement différent ).la source
-e
juges, le texte déjà jugé par bash, n'est-ce pas? si c'est correct, cela élimine la confusion. Pourriez-vous peut-être nous dire commentsed
se comporte a-t-il sa propre technique d'évasion? donc je veux dire que ça se comporte comme un écho avec-e
?sed
. Vous pouvez cependant poser une autre question (à propos desed
seulement), faites d'abord vos propres recherches.sed
suivra les mêmes principes de base: bash interprétera la ligne de commande selon ses règles, analysant (et peut-être supprimant) les guillemets et les échappements. Le résultat est transmis àsed
, qui l'interprète selon ses règles d'échappement. BTW, vous pouvez simplifier cela en utilisant une chaîne entre guillemets simplesbash
, car cela n'a pas d'interprétation d'échappement eny effectuée (par bash) - bash supprime les guillemets simples et transmet ce qui s'y trouve directement à la commande.echo -e "\\\n Hello!"
cas où. Ici bash fera s'échapper, et il deviendra\\n
, puis-e
échappera aux deux barres obliques inversées résultantes\\n
et ensuite elles deviendront\n
. maintenant qui interprète\n
pour en faire une nouvelle ligne? Normalement, dans le cas deecho -e "\n Hello!"
, bash ne fait rien et-e
interprète\n
comme une nouvelle ligne. mais dans la première situation mentionnée, le processus d'interprétation a été fait avant de se\n
faire interpréter. Pourriez-vous expliquer cela s'il vous plaît?sed
qui m'a dérouté hier soir (peut-être que j'ai fait quelque chose de mal hier), mais maintenant je réessayé la même chose avececho -e
etsed
, et j'ai eu la même chose que excepté, merci!