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:
-
echo -e "\ Hello!"
- nada especial parabash
, nada especial paraecho
;\
fica. -
echo -e "\ Hello!"
- o primeiro\
dizbash
para tratar o segundo\
literalmente;echo
obtém\ Hello!
e age como acima. -
echo -e "\\ Hello!"
- o primeiro\
dizbash
para tratar o segundo\
literalmente;echo
obtém\ Hello!
e (por causa de-e
) ele reconhece\
como\
. -
echo -e "\\ Hello!"
- o primeiro\
dizbash
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\
. -
echo -e "\\\ Hello!"
- o primeiro\
dizbash
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
:
-
echo -e "\n Hello!"
- não há nada de especial embash
, o echo obtém a mesma sequência e (por causa de-e
) interpreta\n
como uma nova linha. -
echo -e "\n Hello!"
-bash
interpreta\
como\
;echo
obtém\n Hello!
e o resultado é o mesmo acima. -
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
).