Qualcuno potrebbe spiegare cosa sta succedendo dietro le quinte nella fuga di caratteri nella shell di Linux? Ho provato quanto segue e ho cercato su Google molto, senza alcun successo nel capire cosa (e come) sta succedendo:
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!
Mi sono completamente perso lì, quindi per esempio, perché tre barre rovesciate danno solo una barra rovesciata? Mi aspetterei: i primi due saranno salvati in uno, il terzo non troverà nulla per sfuggire, quindi rimarrà una barra (linea nel primo esperimento), ma ciò che sta accadendo è che il terzo è semplicemente scompare.
Perché ricevo una barra rovesciata da quattro \\\\ Hello
? Mi aspetto che ogni coppia dia una barra rovesciata -> due barre rovesciate.
E perché ho bisogno di tre barre rovesciate nell'ultimo caso per sfuggire a \ n? cosa sta succedendo in background di fuga per ottenerlo? e in cosa differisce dal \\n
caso?
Apprezzo qualsiasi spiegazione di ciò che sta succedendo nelle righe precedenti.
echo -e
non è sicura: echo
si comporterà secondo lo standard se entrambe le opzioni di runtime posix
e xpg_echo
sono abilitate, o se compilate con opzioni equivalenti di build-time. La pratica sicura è usare printf
invece - vedi le sezioni APPLICAZIONE UTILIZZO e MOTIVAZIONE del link sopra che descrive come printf
agire per sostituire echo
.
echo -e
il comportamento non è definito in alcun modo dagli standard - vedi pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html . L'output è completamente definito dall'implementazione se c'è un backslash letterale in qualsiasi punto degli input e l'unica opzione consentita è-n
(il che significa che un'implementazione conforme agli standard avràecho -e
stampa-e
sul suo output).