O que você quer dizer com 'não é uma linha de comando comum'? echogeralmente é um shell embutido, mas geralmente existe também /usr/bin/echo. O -enã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?
maxschlepzig
Quero imprimir -e usando eco. Alguma sugestão?
Fábrica de destaques
3
considere usar printf, é mais portátil.
Michael Durrant
1
Curiosamente, echo -- -etambém não funciona. Convencionalmente (pelo menos nos utilitários GNU), o traço duplo indica o fim das opções, sendo o restante mantido como argumentos literais.
22714
6
echoloucura novamente. Se as pessoas usassem printfe nunca olhassem para trás.
Jens
Respostas:
9
com nova linha
echo -en '-e\n'
sem nova linha
echo -e '-e\c'
com espaços ao redor:
echo '-e '
echo ' -e'
usando backspace (graças a Joseph R.):
echo -e ' \b-e'
(ele gera o SPC BS - e LF, mas quando enviado para um terminal que é renderizado -ecomo BS move o cursor para trás uma coluna para a esquerda, causando -a substituição do SPC)
O comportamento de bash's echoincorporado pode depender versão bash. Também depende do ambiente ( POSIXLY_CORRECT, SHELLOPTSe BASHOPTSvariáveis), das opções ( posix, xpg_echo), das opções de compilação e argv[0]( shvs bash). Aqui testado com GNU bash 4.2.53(1), compilação padrão, opções padrão, ambiente vazio, chamado como bash. Trabalha também com zsh 5.0.5.
Por que essas "soluções alternativas" ofuscadas e feias até os ossos recebem votos positivos? Charles Duffy abaixo tem a resposta correta: use printf e esqueça esses problemas de uma vez por todas.
Jens
7
Jens: porque o OP perguntou como fazê-lo com o echocomando. Atitude não é necessária.
CTC
1
echo -e ' \b-e'produz espaço-backspace-dash-e. Somente exibido em um terminal, você terá a ilusão de que é traço-e.
Stéphane Chazelas
1
@CharlesDuffy, echo -e "\0-e"produz NUL-dash-e. É apenas que os terminais ignorar que caracteres NUL (NULs usado até mesmo para ser enviado para alguns terminais (que não suportam o controle de fluxo) para dar-lhes tempo para fazer outras coisas longos como um retorno de carro. Consulte a seção sob Atrasos e estofamento em terminfo(5).)
Stéphane Chazelas
25
A melhor solução não é usar echo, mas usar printf.
printf '%s\n'-e
Isso funciona com variáveis arbitrárias:
var=-e
printf '%s\n'"$var"
... significando que você não precisa fazer nenhuma preparação / modificação especial em outra parte do seu código, com base no conhecimento de que um valor será echod.
Não é possível usar eco de forma portável em todos os sistemas POSIX, a menos que as seqüências -n (como o primeiro argumento) e escape sejam omitidas.
O utilitário printf pode ser usado de maneira portável para emular qualquer um dos comportamentos tradicionais do utilitário eco, da seguinte maneira (assumindo que o IFS tenha seu valor padrão ou não esteja definido):
O eco histórico do System V e os requisitos das implementações XSI neste volume do POSIX.1-2008 são equivalentes a:
Curiosamente, a nota do POSIX diz que echo -eé portátil. Diz que -ndeve ser evitado, e seqüências de escape devem ser evitadas. echo -eevita ambos. Mas, como você indica na última parte de sua resposta, nos sistemas GNU, echonão se preocupa em estar em conformidade com o POSIX por padrão, e o POSIX apenas observa a portabilidade entre os sistemas POSIX.
hvd 16/11
@ DVD, eu não vejo -ecoberto na parte das especificações que eu vinculei . Você poderia fornecer um link ou citação que o cubra?
Charles Duffy
É a falta de menção que diz isso. :) Ele lista os usos que não são portáteis e -enão são mencionados, assim como -eé portátil (novamente, nos sistemas POSIX). Para ser justo, o que você citou é informativo, mas o texto normativo diz a mesma coisa: "Se o primeiro operando for -n, ou se algum dos operandos contiver um caractere <slash>, os resultados serão definidos pela implementação."
hvd
2
@ DVD, pelo contrário. Para executar conforme especificado, é echonecessário emitir todos os argumentos sem comportamento definido de maneira contrária pelo padrão. Assim - diferentemente de quase todas as outras ferramentas de linha de comando cobertas pela especificação POSIX - echona verdade, especifica o comportamento para argumentos não fornecidos: Imprimindo-os. Não há espaço para adicionar novos sinalizadores sem quebrar as especificações.
Charles Duffy
2
@hvd, ... para que o assunto, consulte a OPTIONSseção, onde é estabelecido em preto e branco: Implementations shall not support any options.
Charles Duffy
9
Com GNU echo's -ecom os códigos ASCII para os caracteres:
$ /bin/echo -e '\055'e
-e
055é o número ASCII octal para -(consulte man asciipara referência rápida).
/bin/echoé realmente especificado para POSIX. No entanto, sua interpretação das seqüências de escape octais é uma extensão XSI da especificação da linha de base.
Charles Duffy
@CharlesDuffy Na verdade, eu errei. +1 para printf (meu primeiro pensamento também). Dado que -ehá uma extensão, no entanto, existe uma maneira de forçar o comportamento POSIX puro echo? Isso eliminaria toda a incerteza sobre isso, eu acho.
Muru
2
Na verdade sim! A exportação POSIXLY_CORRECT=1resultará em um comportamento compatível com POSIX para GNU's /bin/echo.
Charles Duffy
+1 Obrigado, bom saber para manter seus scripts portáteis e "independentes do Linux homebrew" (ou seja, também trabalhando em uma estação de trabalho profissional no trabalho).
Syntaxerror 5/12/14
@Kusalananda esqueceu isso.
muru 16/05
3
Embora a solução óbvia, padrão e recomendada seja usar printf, fazê-lo echopode ser bastante complicado, dependendo da implementação (não tão complicado quanto no -nentanto).
Compliant POSIX.2017 echos
O POSIX requerecho -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 echode bashquando as opções xpg_echoe posixforam ativadas (em tempo de execução ou tempo de compilação, como no /bin/shApple macOS). set -o posix; shopt -s xpg_echo(a posixopção também pode ser ativada se invocada como shou quando POSIXLY_CORRECTou SHELLOPTS=posixestiver no ambiente).
os /bin/echosistemas UNIX certificados (AIX, macOS, Solaris pelo menos) e a maioria dos BSDs
o echobuiltin de dash, ksh88o shell Bourne, csh, tcsh, fino, rc, es, akanga
GNU echo( /bin/echoem sistemas GNU) quando POSIXLY_CORRECTestiver no ambiente.
o echobuiltin de mkshe alguns outros pdksh deriva quando sua posixopção está ativada.
o echoembutido de yashquando $ECHO_STYLEou não é configurado um ou de SYSV, XSI, BSD, DASH,RAW
implementações que suportam -e
Inclui echode pesquisa Unix V8 (de onde vem), GNU, busybox, o echoembutida de bash, zsh, pdkshe derivados, fish, algumas ashconchas baseados como busybox shou a shde alguns BSDs, versões recentes do ksh93(em alguns sistemas, e com alguns valores de $PATH) com suas configurações padrão, yashcom $ECHO_STYLEum GNUou ZSH:
echo -e '-e\n\c'
As implementações que suportam -einvariavelmente -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 echoque 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/echoonde 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 yashvariá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).
Isso não vai funcionar em zshonde -é o fim da opção de delimitador ou em todas as echoimplementações que não suportam -n(aqueles que o apoio -etambém suportam -nembora)
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?echo -- -e
também não funciona. Convencionalmente (pelo menos nos utilitários GNU), o traço duplo indica o fim das opções, sendo o restante mantido como argumentos literais.echo
loucura novamente. Se as pessoas usassemprintf
e nunca olhassem para trás.Respostas:
com nova linha
sem nova linha
com espaços ao redor:
usando backspace (graças a Joseph R.):
(ele gera o SPC BS - e LF, mas quando enviado para um terminal que é renderizado
-e
como BS move o cursor para trás uma coluna para a esquerda, causando-
a substituição do SPC)O comportamento de
bash
'secho
incorporado pode depender versão bash. Também depende do ambiente (POSIXLY_CORRECT
,SHELLOPTS
eBASHOPTS
variáveis), das opções (posix
,xpg_echo
), das opções de compilação eargv[0]
(sh
vsbash
). Aqui testado comGNU bash 4.2.53(1)
, compilação padrão, opções padrão, ambiente vazio, chamado comobash
. Trabalha também comzsh 5.0.5
.fonte
echo -e 'x\b-e'
echo
comando. Atitude não é necessária.echo -e ' \b-e'
produz espaço-backspace-dash-e. Somente exibido em um terminal, você terá a ilusão de que é traço-e.echo -e "\0-e"
produzNUL-dash-e
. É apenas que os terminais ignorar que caracteres NUL (NULs usado até mesmo para ser enviado para alguns terminais (que não suportam o controle de fluxo) para dar-lhes tempo para fazer outras coisas longos como um retorno de carro. Consulte a seção sob Atrasos e estofamento emterminfo(5)
.)A melhor solução não é usar
echo
, mas usarprintf
.Isso funciona com variáveis arbitrárias:
... significando que você não precisa fazer nenhuma preparação / modificação especial em outra parte do seu código, com base no conhecimento de que um valor será
echo
d.Aliás, a especificação do comando shell POSIX para
echo
reconhece que não é portável conforme implementada e contém uma observação sobre esse assunto:(Enfase adicionada).
Dito isto, nos sistemas GNU, existe uma alternativa: Solicitar um comportamento compatível com os padrões.
fonte
echo -e
é portátil. Diz que-n
deve ser evitado, e seqüências de escape devem ser evitadas.echo -e
evita ambos. Mas, como você indica na última parte de sua resposta, nos sistemas GNU,echo
não se preocupa em estar em conformidade com o POSIX por padrão, e o POSIX apenas observa a portabilidade entre os sistemas POSIX.-e
coberto na parte das especificações que eu vinculei . Você poderia fornecer um link ou citação que o cubra?-e
não são mencionados, assim como-e
é portátil (novamente, nos sistemas POSIX). Para ser justo, o que você citou é informativo, mas o texto normativo diz a mesma coisa: "Se o primeiro operando for -n, ou se algum dos operandos contiver um caractere <slash>, os resultados serão definidos pela implementação."echo
necessário emitir todos os argumentos sem comportamento definido de maneira contrária pelo padrão. Assim - diferentemente de quase todas as outras ferramentas de linha de comando cobertas pela especificação POSIX -echo
na verdade, especifica o comportamento para argumentos não fornecidos: Imprimindo-os. Não há espaço para adicionar novos sinalizadores sem quebrar as especificações.OPTIONS
seção, onde é estabelecido em preto e branco:Implementations shall not support any options
.Com GNU
echo
's-e
com os códigos ASCII para os caracteres:055
é o número ASCII octal para-
(consulteman ascii
para referência rápida).fonte
/bin/echo
é realmente especificado para POSIX. No entanto, sua interpretação das seqüências de escape octais é uma extensão XSI da especificação da linha de base.-e
há uma extensão, no entanto, existe uma maneira de forçar o comportamento POSIX puroecho
? Isso eliminaria toda a incerteza sobre isso, eu acho.POSIXLY_CORRECT=1
resultará em um comportamento compatível com POSIX para GNU's/bin/echo
.Embora a solução óbvia, padrão e recomendada seja usar
printf
, fazê-loecho
pode ser bastante complicado, dependendo da implementação (não tão complicado quanto no-n
entanto).Compliant POSIX.2017
echo
sO POSIX requer
echo -e
a saída-e<newline>
. Então é só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 aecho
):echo
debash
quando as opçõesxpg_echo
eposix
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
(aposix
opção também pode ser ativada se invocada comosh
ou quandoPOSIXLY_CORRECT
ouSHELLOPTS=posix
estiver no ambiente)./bin/echo
sistemas UNIX certificados (AIX, macOS, Solaris pelo menos) e a maioria dos BSDsecho
builtin dedash
,ksh88
o shell Bourne, csh, tcsh, fino, rc, es, akangaecho
(/bin/echo
em sistemas GNU) quandoPOSIXLY_CORRECT
estiver no ambiente.echo
builtin demksh
e alguns outros pdksh deriva quando suaposix
opção está ativada.echo
embutido deyash
quando$ECHO_STYLE
ou não é configurado um ou deSYSV
,XSI
,BSD
,DASH
,RAW
implementações que suportam
-e
Inclui
echo
de pesquisa Unix V8 (de onde vem), GNU, busybox, oecho
embutida debash
,zsh
,pdksh
e derivados,fish
, algumasash
conchas baseados como busyboxsh
ou ash
de alguns BSDs, versões recentes doksh93
(em alguns sistemas, e com alguns valores de$PATH
) com suas configurações padrão,yash
com$ECHO_STYLE
umGNU
ouZSH
:As implementações que suportam
-e
invariavelmente-n
, portanto:funcionaria também.
zsh
zsh
'secho
é a única aplicação que eu sei que suporta um marcador de fim-de-opção (-
).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) comecho -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:(nessa implementação,
\c
é reconhecido apenas no final e nenhuma outra sequência de escape é suportada).E
yash
é:(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).fonte
Use
-n
para evitar nova linha:fonte
zsh
onde-
é o fim da opção de delimitador ou em todas asecho
implementações que não suportam-n
(aqueles que o apoio-e
também suportam-n
embora)