Como imprimo '-e' com eco?

8

Eu sei que echo -enão é um comando comum. Eu tentei echo '-e'e echo \-eeles ainda não funcionam.

Fábrica de Destaques
fonte
1
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.

jimmij
fonte
+1 Tambémecho -e 'x\b-e'
Joseph R.
2
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.


Aliás, a especificação do comando shell POSIX paraecho reconhece que não é portável conforme implementada e contém uma observação sobre esse assunto:

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:

printf "%b\n" "$*"

O eco do BSD é equivalente a:

if [ "X$1" = "X-n" ]
then
    shift
    printf "%s" "$*"
else
    printf "%s\n" "$*"
fi

Novos aplicativos são incentivados a usar printf em vez de eco.

(Enfase adicionada).


Dito isto, nos sistemas GNU, existe uma alternativa: Solicitar um comportamento compatível com os padrões.

$ POSIXLY_CORRECT=1 /bin/echo -e
-e
Charles Duffy
fonte
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).

muru
fonte
1
/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 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 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).

Stéphane Chazelas
fonte
2

Use -npara evitar nova linha:

$ echo -n - && echo e
-e
vishalknishad
fonte
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)
Stéphane Chazelas