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.