Por que 'echo -e “\\\ SOME_TEXT”' mostra apenas uma barra invertida?

17

Alguém poderia explicar o que está acontecendo nos bastidores do personagem escapando no shell do Linux? Eu tentei o seguinte e pesquisei muito, 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, então permanecerá um slash (linha no primeiro experimento), mas o que está acontecendo é que o terceiro desaparece .
Por que estou recebendo uma barra invertida de quatro \\ Hello ? Espero que cada par dê uma barra invertida - > duas barras invertidas.

E por que preciso de três barras invertidas no último caso para escapar? o que está acontecendo no fundo de escapar para conseguir isso? e como é diferente de \n case?

Agradeço qualquer explicação sobre o que está acontecendo nas linhas anteriores.

    
por Mohammed Noureldin 13.09.2017 / 02:12

1 resposta

27

Isso ocorre porque bash e echo -e combinados. De man 1 bash

A non-quoted backslash (\) is the escape character. It preserves the literal value of the next character that follows, with the exception of <newline>. […]

Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of $, ', \, […] The backslash retains its special meaning only when followed by one of the following characters: $, ', ", \, or <newline>.

O ponto é: barra invertida com aspas duplas nem sempre é especial.

Existem várias implementações de echo em geral, são incorporadas em bash ; o importante aqui é esse comportamento:

If -e is in effect, the following sequences are recognized:
\
backslash
[…]
\n
new line

Agora podemos decodificar:

  1. echo -e "\ Hello!" - nada especial para bash , nada especial para echo ; \ fica.
  2. echo -e "\ Hello!" - o primeiro \ diz bash para tratar o segundo \ literalmente; echo obtém \ Hello! e age como acima.
  3. echo -e "\\ Hello!" - o primeiro \ diz bash para tratar o segundo \ literalmente; echo obtém \ Hello! e (por causa de -e ) ele reconhece \ como \ .
  4. echo -e "\\ Hello!" - o primeiro \ diz bash para tratar o segundo \ literalmente; o terceiro diz o mesmo sobre o quarto; echo obtém \ Hello! e (por causa de -e ) ele reconhece \ como \ .
  5. echo -e "\\\ Hello!" - o primeiro \ diz bash para tratar o segundo \ literalmente; o terceiro diz o mesmo sobre o quarto; o último não é especial; echo obtém \\ Hello! e (por causa de -e ) reconhece o% inicial\ como \ , o último \ permanece intacto.

E assim por diante. Como você pode ver, até quatro barras invertidas consecutivas dão um resultado. É por isso que você precisa (pelo menos) nove deles para conseguir três. 9 = 4 + 4 + 1.

Agora com \n :

  1. echo -e "\n Hello!" - não há nada de especial em bash , o echo obtém a mesma sequência e (por causa de -e ) interpreta \n como uma nova linha.
  2. echo -e "\n Hello!" - bash interpreta \ como \ ; echo obtém \n Hello! e o resultado é o mesmo acima.
  3. echo -e "\\n Hello!" - bash interpreta o% inicial\ como \ ; echo obtém \n Hello! e (por causa de -e ) interpreta \ como um literal \ que precisa ser impresso.

Os resultados seriam diferentes com ' em vez de " (devido ao comportamento bash diferente) ou sem -e (comportamento diferente echo ).

    
por 13.09.2017 / 03:08