Könnte jemand erklären, was sich hinter den Kulissen von Charakteren abspielt, die in der Linux-Shell entkommen? Ich habe Folgendes ausprobiert und viel gegoogelt, ohne Erfolg zu haben, was (und wie) vor sich geht:
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!
Ich bin dort total verloren. Warum geben beispielsweise drei Backslashes nur einen Backslash? Ich würde erwarten: die ersten beiden werden zu einem geflüchtet, der dritte wird nichts zu fliehen finden, so dass es ein Schrägstrich bleibt (Zeile im ersten Experiment), aber was passiert ist, dass die dritte gerade verschwindet.
Warum bekomme ich einen Backslash von vier \\\\ Hello
? Ich würde erwarten, dass jedes Paar einen Backslash gibt -> zwei Backslashes.
Und warum brauche ich im letzten Fall drei Backslashes, um \ n zu entkommen? Was passiert im Hintergrund der Flucht, um das zu bekommen? und wie unterscheidet es sich von \\n
case?
Ich freue mich über jede Erklärung, was in den vorherigen Zeilen vor sich geht.
echo -e
Verhalten ist sowieso nicht standarddefiniert - siehe pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html . Die Ausgabe ist vollständig implementierungsdefiniert, wenn die Eingaben einen wörtlichen Backslash enthalten. Die einzige zulässige Option ist-n
(dh, für eine standardkonforme Implementierung wird die Ausgabeecho -e
gedruckt-e
).echo -e
ist nicht sicher:echo
wird in Übereinstimmung mit dem Standard verhalten , wenn beideposix
undxpg_echo
Runtime - Optionen aktiviert sind, oder wenn mit dem entsprechenden Aufbauzeitmöglichkeiten zusammengestellt. Die sichere Vorgehensweise ist,printf
stattdessen zu verwenden - siehe die Abschnitte APPLICATION USAGE und RATIONALE des obigen Links, in denen beschrieben wird, wie Sieprintf
als Ersatz für agieren könnenecho
.Antworten:
Dies liegt daran
bash
undecho -e
kombiniert. Vonman 1 bash
Der Punkt ist: Backslash in doppelten Anführungszeichen ist nicht immer etwas Besonderes.
Es gibt verschiedene Implementierungen von
echo
im Allgemeinen, es ist ein eingebautesbash
; Das Wichtigste hier ist dieses Verhalten:Jetzt können wir dekodieren:
echo -e "\ Hello!"
- nichts Besonderes fürbash
, nichts Besonderes fürecho
;\
bleibt.echo -e "\\ Hello!"
- die erste\
sagtbash
, die zweite\
wörtlich zu behandeln ;echo
bekommt\ Hello!
und verhält sich wie oben.echo -e "\\\ Hello!"
- die erste\
sagtbash
, die zweite\
wörtlich zu behandeln ;echo
bekommt\\ Hello!
und (wegen-e
) erkennt es\\
als\
.echo -e "\\\\ Hello!"
- die erste\
sagtbash
, die zweite\
wörtlich zu behandeln ; der dritte sagt dasselbe über den vierten;echo
bekommt\\ Hello!
und (wegen-e
) erkennt es\\
als\
.echo -e "\\\\\ Hello!"
- die erste\
sagtbash
, die zweite\
wörtlich zu behandeln ; der dritte sagt dasselbe über den vierten; der letzte ist nicht besonders;echo
bekommt\\\ Hello!
und (wegen-e
) erkennt es den Anfangsbuchstaben\\
als\
, der letzte\
bleibt erhalten.Und so weiter. Wie Sie sehen können, führen bis zu vier aufeinanderfolgende Backslashes zu einem Ergebnis. Deshalb braucht man (mindestens) neun, um drei zu bekommen. 9 = 4 + 4 + 1.
Jetzt mit
\n
:echo -e "\n Hello!"
- Es gibt nichts Besonderesbash
, Echo bekommt den gleichen String und wird (wegen-e
)\n
als Newline interpretiert .echo -e "\\n Hello!"
-bash
interpretiert\\
als\
;echo
wird\n Hello!
und das Ergebnis ist das gleiche wie oben.echo -e "\\\n Hello!"
-bash
interpretiert die Initiale\\
als\
;echo
wird\\n Hello!
und (wegen-e
) wird es\\
als Literal interpretiert\
, das gedruckt werden muss.Die Ergebnisse wären unterschiedlich mit
'
statt"
(aufgrund unterschiedlichenbash
Verhaltens) oder ohne-e
(unterschiedlichesecho
Verhalten).quelle
-e
den bereits von bash ausgeführten Text beurteilt. Ist das richtig? Wenn dies korrekt ist, wird die Verwirrung beseitigt. Könnten Sie vielleicht erwähnen, wie sich dassed
verhält? Hat es eine eigene Fluchttechnik? Ich meine, verhält es sich wie ein Echo-e
?sed
. Sie können aber auch eine andere Frage stellen (ungefährsed
), machen Sie zuerst Ihre eigenen Nachforschungen.sed
folgt den gleichen Grundprinzipien: bash interpretiert die Befehlszeile gemäß ihren Regeln und analysiert (und entfernt möglicherweise) Anführungszeichen und Escapezeichen. Das Ergebnis davon wird an übergebensed
, der es gemäß seiner Escape-Regeln interpretiert . Übrigens können Sie dies vereinfachen, indem Sie eine Zeichenfolge inbash
Anführungszeichen eingeben, da für diese keine Escape-Interpretation (durch Bash) ausgeführt wird. Bash entfernt die einfachen Anführungszeichen und übergibt die darin enthaltenen Informationen direkt an den Befehl.echo -e "\\\n Hello!"
Fall. Hier wird bash fliehen, und es wird werden\\n
, dann-e
werden die resultierenden zwei Backslashes fliehen\\n
und dann werden sie\n
. Wer interpretiert\n
es nun, um eine neue Zeile zu machen? Normalerweiseecho -e "\n Hello!"
tut bash im Falle von nichts und-e
interpretiert\n
als neue Zeile. Aber in der erstgenannten Situation wurde der Interpretationsprozess durchgeführt, bevor\n
man interpretiert wurde. Könnten Sie das bitte erklären?sed
was mich letzte Nacht verwirrt hat (vielleicht habe ich gestern etwas falsch gemacht), aber jetzt habe ich habe das gleiche mitecho -e
und nochmal probiertsed
und habe das selbe bekommen wie mit ausnahme, danke!