Embora a solução óbvia, padrão e recomendada seja usar printf
, fazê-lo echo
pode ser bastante complicado, dependendo da implementação (não tão complicado quanto no -n
entanto).
Compliant POSIX.2017 echo
s
O POSIX requer echo -e
a saída -e<newline>
. Então é só
echo -e
há. Em conformidade com o POSIX echo
(a maioria deles não é compatível com POSIX em outros aspectos, a especificação POSIX é quase inútil no que diz respeito a echo
):
- o início
echo
de bash
quando as opções xpg_echo
e posix
foram ativadas (em tempo de execução ou tempo de compilação, como no /bin/sh
Apple macOS). set -o posix; shopt -s xpg_echo
(a posix
opção também pode ser ativada se invocada como sh
ou quando POSIXLY_CORRECT
ou SHELLOPTS=posix
estiver no ambiente).
- os
/bin/echo
sistemas UNIX certificados (AIX, macOS, Solaris pelo menos) e a maioria dos BSDs
- o
echo
builtin de dash
, ksh88
o shell Bourne, csh, tcsh, fino, rc, es, akanga
- GNU
echo
( /bin/echo
em sistemas GNU) quando POSIXLY_CORRECT
estiver no ambiente.
- o
echo
builtin de mksh
e alguns outros pdksh deriva quando sua posix
opção está ativada.
- o
echo
embutido de yash
quando $ECHO_STYLE
ou não é configurado um ou de SYSV
, XSI
, BSD
, DASH
,RAW
implementações que suportam -e
Inclui echo
de pesquisa Unix V8 (de onde vem), GNU, busybox, o echo
embutida de bash
, zsh
, pdksh
e derivados, fish
, algumas ash
conchas baseados como busybox sh
ou a sh
de alguns BSDs, versões recentes do ksh93
(em alguns sistemas, e com alguns valores de $PATH
) com suas configurações padrão, yash
com $ECHO_STYLE
um GNU
ou ZSH
:
echo -e '-e\n\c'
As implementações que suportam -e
invariavelmente -n
, portanto:
echo -ne '-e\n'
funcionaria também.
zsh
zsh
's echo
é a única aplicação que eu sei que suporta um marcador de fim-de-opção ( -
).
echo - -e
Tornando-o o único shell semelhante a Bourne echo
que pode gerar dados arbitrários (também porque é o único que suporta NUL bytes em suas variáveis e os argumentos de seus componentes internos) com echo -E - "$data"
)
Exceto pelo problema de NUL-byte, outras implementações que podem gerar dados arbitrários são o FreeBSD ou o macOS, /bin/echo
onde você pode:
/bin/echo "$data
\c"
(nessa implementação, \c
é reconhecido apenas no final e nenhuma outra sequência de escape é suportada).
E yash
é:
ECHO_STYLE=RAW echo "$data"
(observe que as yash
variáveis podem conter apenas texto, portanto, não sequências de bytes arbitrárias em locais onde nem todas as seqüências de bytes podem formar caracteres válidos, como aqueles que usam UTF-8 como seu mapa de caracteres).
echo
geralmente é um shell embutido, mas geralmente existe também/usr/bin/echo
. O-e
não é POSIX, mas está disponível, por exemplo, com o bash. Dê mais detalhes sobre o que você quer dizer com 'eles ainda não funcionam'. Qual é o comportamento esperado?