echo -e
e echo $'...'
são semelhantes, pois suportam as seguintes sequê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
\c suppress further output
$ echo -e 'start\n\cIstop'
start
$ echo $'start\n\cIstop'
start
stop
nnn the eight-bit character whose value is the octal value nnn (zero to three octal digits)
nnn 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 -e
suporta:
$ ls
-e -n
$ echo *
$ printf "%s\n" *
-e
-n
Por contraste, $'....'
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 extensões \c
são incompatíveis:
\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
\c suppress further output
$ echo -e 'start\n\cIstop'
start
$ echo $'start\n\cIstop'
start
stop
nnn the eight-bit character whose value is the octal value nnn (zero to three octal digits)
nnn 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)
Para echo -e
acima, \c
suprime mais saída, ignorando, assim, o Istop
. Por contraste, para $'...'
, o \cI
é interpretado como uma guia.
A forma visualmente semelhante: $"..."
Por contraste com $'...'
, a função de $"..."
é bem diferente. Isso fará com que a string contida seja traduzida de acordo com a localidade atual.
A controvérsia echo -e
echo -e
não é universalmente suportado pelos shells e muitos consideram a opção -e
como um erro de design. Observe:
$ ls
-e -n
$ echo *
$ printf "%s\n" *
-e
-n
Como você pode ver, se o que você está imprimindo com echo
começa com um traço, os resultados podem ser inesperados. A menos que você tenha certeza de que a primeira string que será impressa com echo
não comece com um traço, provavelmente será melhor usar printf
.
Por esses motivos, o padrão POSIX é concluído :
New applications are encouraged to use printf instead of echo.
Chet Ramey, que manteve bash
nos últimos 22 anos, concorda :
[N]ew code should use printf.