As barras invertidas são tratadas especialmente por echo -e
, mas primeiro são às vezes tratadas especialmente pelo shell (que neste caso é bash
), de acordo com as regras de cotação do shell .
O argumento echo
realmente vê é Hello\\n
. Como você passou -e
para echo
, ele trata escapes de barra invertida especialmente e \\
é recolhido para um único \
. A final n
não é escapada, então aparece literalmente.
A razão para isso é que, antes e separadamente da operação em echo
si, o shell trata \
especialmente em alguns contextos, mas não em outros. Não cotadas \
personagens são sempre tratados de maneira especial, único citado \
nunca são tratados de maneira especial, mas o tratamento da dupla citou \
personagens, como no comando que você executou, é mais sutil e complicado.
Quando o shell encontra um texto com aspas duplas em um comando, "Hello\\\n"
ele trata \
como um caractere de escape quando precede um caractere que pode ter um significado especial entre aspas duplas e não o contrário .
- Porque
\
às vezes tem um significado especial por dentro ""
, um \
que precede imediatamente outro \
tem o efeito de citar esse segundo \
. Assim, entre aspas duplas, as primeiras \\
são recolhidas \
.
- Após esses dois primeiros
\
caracteres, existe um terceiro \
caractere que não é afetado pelos dois primeiros e que precede um n
. Mas n
não é um personagem que é tratado especialmente entre aspas duplas, portanto, o \
antes não é tratado especialmente nessa situação. Assim \n
fica \n
.
O efeito é que, entre aspas duplas, \\\n
é interpretado como \\n
.
Quando echo -e
vê \\n
, o primeiro \
remove um significado especial do segundo, então echo
imprime \n
literalmente para esse texto.
Se seu objetivo é imprimir Hello
com uma nova linha extra, mas sem barras invertidas (a pergunta era originalmente ambígua sobre isso, mais acho que é um exemplo útil), então uma solução é remover a \
. Execução de echo -e "Hello\\n"
saídas Hello
com uma nova linha extra no final.
Uma solução melhor é usar aspas simples e escrever echo -e 'Hello\n'
. Aspas simples são a forma mais forte de citar. Uma solução ainda melhor é geralmente usar em printf
vez de echo
, o que nesse caso seria printf 'Hello\n\n'
.
Se seu objetivo é imprimir, Hello\
incluindo a barra invertida, seguida por uma nova linha extra , a abordagem de aspas duplas é possível, mas complicada. Para descobrir, trabalhe de trás para frente: echo -e
converte \\
para \
e \n
para uma nova linha e aspas duplas \\
para \
, para que você possa fazer isso com seis barras invertidas ( echo -e "Hello\\\\\\n"
), porque \\n
se transforma \n
devido a uma barra invertida escapando da outra. Você também pode fazer isso com cinco, porque as aspas duplas ficam retidas \n
quando \
não é escapado.
Isso ilustra o benefício da citação simples: basta colocar o que você deseja echo -e
ver dentro das aspas simples ( echo -e 'Hello\\\n'
). printf
também é bom aqui. Uma opção é printf 'Hello\\\n\n'
. Mas onde printf
realmente brilha é que você pode conectar argumentos adicionais. Você pode usar printf '%s\n\n' 'Hello\'
, que insere o segundo argumento (literalmente, Hello\
porque aspas simples não mudam nada) no lugar de %s
.