Como imprimo '-e' com eco?

8

Eu sei que echo -e não é um comando comum. Eu tentei echo '-e' e echo \-e , mas eles ainda não funcionam.

    
por Highlights Factory 15.11.2014 / 11:11

5 respostas

8
  • 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 envia SPC BS - e LF, mas quando enviado para um terminal que é renderizado como -e quando BS move o cursor de volta uma coluna para a esquerda fazendo com que - sobrescreva o SPC)

O comportamento de bash ' echo builtin pode depender da versão bash. Também depende do ambiente ( POSIXLY_CORRECT , SHELLOPTS e BASHOPTS variables), as opções ( posix , xpg_echo ), as opções de construção e argv[0] ( sh vs bash ). Aqui testado com GNU bash 4.2.53(1) , construção padrão, opções padrão, ambiente vazio, chamado como bash . Funciona também com zsh 5.0.5 .

    
por 15.11.2014 / 11:38
23

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"

... o que significa que você não precisa fazer nenhuma preparação / modificação especial em outro lugar em seu código com base no conhecimento de que um valor será echo d.

Por acaso, a especificação do comando shell POSIX para echo reconhece que não é portável como implementado e contém uma nota sobre esse assunto:

It is not possible to use echo portably across all POSIX systems unless both -n (as the first argument) and escape sequences are omitted.

The printf utility can be used portably to emulate any of the traditional behaviors of the echo utility as follows (assuming that IFS has its standard value or is unset):

The historic System V echo and the requirements on XSI implementations in this volume of POSIX.1-2008 are equivalent to:

printf "%b\n" "$*"

The BSD echo is equivalent to:

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

New applications are encouraged to use printf instead of echo.

(ênfase adicionada).

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

$ POSIXLY_CORRECT=1 /bin/echo -e
-e
    
por 15.11.2014 / 18:16
9

Com o echo do -e do GNU com os códigos ASCII para os caracteres:

$ /bin/echo -e '5'e
-e

055 é o número octal ASCII para - (consulte man ascii para referência rápida).

    
por 15.11.2014 / 12:55
2

Use -n para evitar nova linha:

$ echo -n - && echo e
-e
    
por 16.05.2017 / 07:35
2

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" )

    
por 02.10.2018 / 12:10

Tags