Diferença entre eco -e "<string>" e eco $ "<string>"

20

Qual é a diferença entre usar

echo -e "Hello\nWorld" 

e

echo $"Hello\nWorld" 

ambos não produzem:

Hello
World
Marca
fonte
11
Você tentou? O segundo sai Hello\nWorld. Você precisa da -eopção para interpretar caracteres de escape.
Becko
4
Para o segundo, suspeito que você pretendesse escrevê-lo com aspas simples echo $'Hello\nWorld', que serão impressas em duas linhas sob bash.
John1024
@ Becko, sim, eu tentei e ambos produzem exatamente a mesma coisa.
Mark

Respostas:

33

echo -ee echo $'...'são semelhantes, pois suportam as seguintes seqüências de escape:

  \a     alert (bell)
  \b     backspace
  \e
  \E     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \\     backslash
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
  \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
  \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
  \UHHHHHHHH
         the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

Eles têm diferenças. Além do acima, echo -esuporta:

  \c     suppress further output
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)

Por outro lado, $'....'suporta:

 \'     single quote
 \"     double quote
 \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
 \cx    a control-x character

Observe que, entre os dois, as \cextensões são incompatíveis:

$ echo -e  'start\n\cIstop'
start
$ echo  $'start\n\cIstop'
start
        stop

Para echo -ecima, \csuprime ainda mais a produção, ignorando assim a Istop. Por outro lado, para $'...', o \cIé interpretado como uma guia.

A forma visualmente semelhante: $"..."

Por outro lado $'...', a função de $"..."é bem diferente. Isso fará com que a string contida seja traduzida de acordo com o código do idioma atual.

A echo -econtrovérsia

echo -enão é universalmente suportado por shells e muitos consideram a -eopção um erro de design. Observar:

$ ls
-e  -n
$ echo *
$ printf "%s\n" *
-e
-n

Como você pode ver, se o que você está imprimindo echocomeça com um traço, os resultados podem ser inesperados. A menos que você tenha certeza de que a primeira sequência com a qual você imprimirá echonão começa com um traço, é provável que seja melhor usá-la printf.

Por esses motivos, o padrão POSIX conclui :

Novos aplicativos são incentivados a usar printf em vez de eco.

Chet Ramey, que mantém bashnos últimos 22 anos, concorda :

[N] o código novo deve usar printf.

John1024
fonte
11
Também digno de nota que tanto Chet e POSIX recomendamos o uso printf, em vez deecho
geirha
@geirha Muito bons pontos. Resposta atualizada.
John1024
11
O problema de opções inesperadas de globs (como *) não é realmente específico echo. Isso acontece com qualquer comando que reconhece opções curtas ou longas (escritas da maneira tradicional) e aceita operandos de nome de arquivo, inclusivels . Indiscutivelmente, a situação é um pouco pior, echojá que (como sua fonte menciona) echonormalmente não aceita --indicar o final das opções, enquanto é possível escrever comandos como ls -- *l. (E realmente se deve, geralmente, para comandos de escrita dessa forma, ao usar globs que começam com *ou -, especialmente em scripts.)
Elias Kagan
Obrigado pela resposta completa, eu tenho um exercício para o meu Sistemas Operacionais curso e eu precisava para imprimir algum texto usando a \nseqüência de escape, então na verdade não importa se eu usar echo -e '...', echo $'...'ouecho $"..."
Mark