Qual é a diferença entre usar
echo -e "Hello\nWorld"
e
echo $"Hello\nWorld"
ambos não produzem:
Hello
World
echo $'Hello\nWorld', que serão impressas em duas linhas sob bash.
Qual é a diferença entre usar
echo -e "Hello\nWorld"
e
echo $"Hello\nWorld"
ambos não produzem:
Hello
World
echo $'Hello\nWorld', que serão impressas em duas linhas sob bash.
Respostas:
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.
$"..."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.
echo -econtrovérsiaecho -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.
*) 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.)
\nseqüência de escape, então na verdade não importa se eu usar echo -e '...', echo $'...'ouecho $"..."
Hello\nWorld. Você precisa da-eopção para interpretar caracteres de escape.