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
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).echo -e
não é seguro:echo
se comportará de acordo com o padrão se as opções de tempo de execuçãoposix
expg_echo
estiverem ativadas ou se compiladas com opções de tempo de construção equivalentes. A prática segura é usar emprintf
vez disso - consulte as seções USO DO APLICATIVO e RACIONAL DO link acima, descrevendo comoprintf
agir como um substitutoecho
.Respostas:
Isto é porque
bash
eecho -e
combinado. A partir deman 1 bash
O ponto é: a barra invertida entre aspas duplas nem sempre é especial.
Existem várias implementações de,
echo
em geral, é um embutidobash
; o importante aqui é esse comportamento:Agora podemos decodificar:
echo -e "\ Hello!"
- nada de especialbash
, nada de especialecho
;\
fica.echo -e "\\ Hello!"
- o primeiro\
dizbash
tratar o segundo\
literalmente;echo
fica\ Hello!
e age como acima.echo -e "\\\ Hello!"
- o primeiro\
dizbash
tratar o segundo\
literalmente;echo
recebe\\ Hello!
e (por causa-e
) reconhece\\
como\
.echo -e "\\\\ Hello!"
- o primeiro\
dizbash
tratar o segundo\
literalmente; o terceiro diz o mesmo sobre o quarto;echo
recebe\\ Hello!
e (por causa-e
) reconhece\\
como\
.echo -e "\\\\\ Hello!"
- o primeiro\
dizbash
tratar o segundo\
literalmente; o terceiro diz o mesmo sobre o quarto; o último não é especial;echo
recebe\\\ Hello!
e (por causa-e
) reconhece a inicial\\
como\
, a última\
permanece intacta.E assim por diante. Como você pode ver, até quatro barras invertidas consecutivas resultam em uma. É por isso que você precisa (pelo menos) nove deles para obter três. 9 = 4 + 4 + 1.
Agora com
\n
:echo -e "\n Hello!"
- não há nada de especialbash
, echo obtém a mesma string e (por causa-e
) ele interpreta\n
como uma nova linha.echo -e "\\n Hello!"
-bash
interpreta\\
como\
;echo
obtém\n Hello!
e o resultado é o mesmo que acima.echo -e "\\\n Hello!"
-bash
interpreta a inicial\\
como\
;echo
recebe\\n Hello!
e (por causa-e
) ele interpreta\\
como um literal\
que precisa ser impresso.Os resultados seriam diferentes com em
'
vez de"
(devido abash
comportamento diferente ) ou sem-e
(echo
comportamento diferente ).fonte
-e
juízes, o texto já julgado pelo bash, certo? se estiver correto, isso remove a confusão. Você poderia mencionar como sesed
comporta? ele tem sua própria construção na técnica de escape? então eu quero dizer se comporta como eco-e
?sed
. Você pode fazer outra pergunta (sed
apenas sobre ), basta fazer sua própria pesquisa primeiro.sed
seguirá os mesmos princípios básicos: o bash interpretará a linha de comando de acordo com suas regras, analisando (e talvez removendo) aspas e escapes. O resultado disso é passado parased
, que o interpreta de acordo com suas regras de escape. BTW, você pode simplificar isso usando uma string de aspas simplesbash
, uma vez que não possui uma interpretação de escape de eny (por bash) - o bash remove as aspas simples e passa o que está dentro delas diretamente para o comando.echo -e "\\\n Hello!"
caso. Aqui o bash escapará , e se tornará\\n
, depois-e
escapará as duas barras invertidas resultantes\\n
e depois se tornarão\n
. agora quem interpreta\n
para torná-lo nova linha? Normalmente, no caso deecho -e "\n Hello!"
, o bash não faz nada e-e
interpreta\n
como nova linha. mas, na primeira situação mencionada, o processo de interpretação foi realizado antes\n
de ser interpretado. Você poderia explicar isso, por favor?sed
que me confundiu ontem à noite (talvez eu tenha feito algo errado ontem), mas agora eu tentei novamente o mesmo comecho -e
esed
, e recebi a mesma coisa que exceto, obrigado!