Enquanto a solução óbvia, padrão e recomendada é usar printf
, fazer isso com echo
pode ser bastante complicado dependendo da implementação (não é tão complicado quanto para -n
).
compatível com POSIX.2017 echo
s
POSIX requer echo -e
para a saída -e<newline>
. Então é só
echo -e
lá. Compatível com POSIX echo
s a esse respeito (a maioria deles não é compatível com POSIX em outros aspectos, a especificação POSIX é quase inútil quando se trata de echo
) inclui:
- o
echo
incorporado em bash
quando as opções xpg_echo
e posix
foram ativadas (no tempo de execução ou no tempo de criação, como para o /bin/sh
do macOS da Apple). set -o posix; shopt -s xpg_echo
(a opção posix
também pode ser ativada se chamada como sh
ou quando POSIXLY_CORRECT
ou SHELLOPTS=posix
estiver no ambiente).
- o
/bin/echo
de sistemas UNIX certificados (AIX, macOS, Solaris pelo menos) e a maioria dos BSDs
- o
echo
incorporado em dash
, ksh88
, o shell Bourne, csh, tcsh, posh, rc, es, akanga
- GNU
echo
( /bin/echo
nos sistemas GNU) quando POSIXLY_CORRECT
está no ambiente.
- o
echo
incorporado de mksh
e alguns outros pdksh-derives quando a opção posix
está ativada.
- o
echo
incorporado de yash
quando $ECHO_STYLE
não está definido ou é um dos SYSV
, XSI
, BSD
, DASH
, RAW
implementações que suportam -e
Inclui echo
da pesquisa Unix V8 (de onde vem), GNU, busybox, echo
incorporado em bash
, zsh
, pdksh
e derivados, fish
, alguns ash
com base em shells como busybox sh
ou sh
de alguns BSDs, versões recentes de ksh93
(em alguns sistemas e com alguns valores de $PATH
) com suas configurações padrão, yash
com $ECHO_STYLE
one de GNU
ou ZSH
:
echo -e '-e\n\c'
As implementações que suportam -e
suportam invariavelmente -n
, portanto:
echo -ne '-e\n'
também funcionaria.
zsh
zsh
echo
é a única implementação que eu sei que suporta um marcador de final de opção ( -
).
echo - -e
Tornando o único shell echo
parecido com o Bourne que pode gerar dados arbitrários (também porque é o único que suporta bytes NUL em suas variáveis e os argumentos de seus componentes internos) com echo -E - "$data"
)