Alguém poderia explicar o que está acontecendo nos bastidores na fuga de caracteres no shell do Linux? Eu tentei o seguinte e pesquisei bastante no Google, sem nenhum sucesso em entender o que (e como) está acontecendo:
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!
Estou totalmente perdido lá, por exemplo, por que três barras invertidas dão apenas uma barra invertida? Eu esperaria: os dois primeiros serão escapados para um, o terceiro não encontrará nada para escapar, e assim permanecerá uma barra (linha no primeiro experimento), mas o que está acontecendo é que o terceiro simplesmente desaparece.
Por que estou recebendo uma barra invertida de quatro \\\\ Hello
? Eu esperava que cada par desse uma barra invertida -> duas barras invertidas.
E por que preciso de três barras invertidas no último caso para escapar \ n? o que está acontecendo no fundo da fuga para conseguir isso? e como é diferente do \\n
caso?
Agradeço qualquer explicação do que está acontecendo nas linhas anteriores.
echo -e
não é seguro: echo
se comportará de acordo com o padrão se as opções de tempo de execução posix
e xpg_echo
estiverem ativadas ou se compiladas com opções de tempo de construção equivalentes. A prática segura é usar em printf
vez disso - consulte as seções USO DO APLICATIVO e RACIONAL DO link acima, descrevendo como printf
agir como um substituto echo
.
echo -e
o comportamento não é definido de qualquer maneira - consulte pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html . A saída é completamente definida pela implementação se houver uma barra invertida literal em qualquer lugar das entradas, e a única opção permitida é-n
(o que significa que uma implementação compatível com os padrões teráecho -e
impressão-e
em sua saída).