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
ist nicht sicher: echo
wird in Übereinstimmung mit dem Standard verhalten , wenn beide posix
und xpg_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 Sie printf
als Ersatz für agieren können echo
.
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
).