Por que o echo não suporta “\ e” (escape) ao usar o argumento -e no MacOSX

34

Quando tento imprimir algum texto colorido usando seqüências de escape ANSI através do comando echo interno, parece que a seqüência de escape \e na sequência de caracteres fornecida é interpretada literalmente em vez de como "escape" é suposto representar. Isso só acontece no Snow Leopard - os exemplos abaixo funcionam como pretendido no Leopard.

Aparentemente, o echo suporta a opção -e , pois interpreta corretamente \n ao usá-lo:

~ $ 
~ $ echo "\n"
\n
~ $ echo -e "\n"


~ $ 

Mas quando tento usar \e , obtenho isto:

~ $ echo -e "\e[34mCOLORS"
\e[34mCOLORS
~ $ 

Como eu disse, no Leopard, o texto acima me daria a string "COLORS" na cor.

Alguém sabe de uma razão pela qual isso pode ser uma mudança pretendida? Que tal uma solução alternativa para imprimir seqüências de escape ANSI de scripts Bash no Snow Leopard?

A versão do shell Bash na minha máquina Leopard é 3.2.17(1)-release e 3.2.48(1)-release na minha máquina do Snow Leopard.

    
por hasseg 01.09.2009 / 23:24

8 respostas

24

Eu não posso dizer por que ele não suporta esse argumento (você pode ter que perguntar aos programadores sobre isso). Eu só sei que na minha caixa de linux, eu entendo isso:

$ /bin/echo --help
Usage: /bin/echo [SHORT-OPTION]... [STRING]...
  or:  /bin/echo LONG-OPTION
Echo the STRING(s) to standard output.

  -n             do not output the trailing newline
  -e             enable interpretation of backslash escapes
  -E             disable interpretation of backslash escapes (default)
      --help     display this help and exit
      --version  output version information and exit

If -e is in effect, the following sequences are recognized:
*emphasized text*
  
$ echo $'\e[34m''COLORS'
NNN the character whose ASCII code is NNN (octal) \ backslash \a alert (BEL) \b backspace \c produce no further output \f form feed \n new line \r carriage return \t horizontal tab \v vertical tab NOTE: your shell may have its own version of echo, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supports. Report echo bugs to [email protected] GNU coreutils home page: <http://www.gnu.org/software/coreutils/> General help using GNU software: <http://www.gnu.org/gethelp/> Report echo translation bugs to <http://translationproject.org/team/>
  • isso não menciona \e escapes
  • diz que é /bin/echo do gnu coreutils. Como a Apple altera a origem de seus componentes do sistema unix de tempos em tempos (por exemplo, mover de zsh para bash), verifique se houve uma alteração para /bin/echo entre o Leopard e o Snow Leopard. Se for gnu, você pode perguntar às pessoas no gnu.org por que elas escolhem não incluir essas sequências.

Quanto a soluções alternativas (isso é mais interessante): Não usando /bin/echo , mas o echo do bash funciona em caixas linux. Se eles mudaram para um bash sem builtin echo (ou algo ainda mais obscuro), você também pode tentar este recurso não muito conhecido do seu shell (funciona pelo menos em bash e zsh):

   Words  of  the  form  $'string' are treated specially.  The word expands to string, with
   backslash-escaped characters replaced as specified by the ANSI  C  standard.   Backslash
   escape sequences, if present, are decoded as follows:
          \a     alert (bell)
          \b     backspace
          \e     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \     backslash
          \'     single quote
          \nnn   the  eight-bit  character whose value is the octal value nnn (one to three
                 digits)
          \xHH   the eight-bit character whose value is the hexadecimal value  HH  (one  or
                 two hex digits)
          \cx    a control-x character

   The expanded result is single-quoted, as if the dollar sign had not been present.

   A  double-quoted string preceded by a dollar sign ($) will cause the string to be trans‐
   lated according to the current locale.  If the current locale is C or POSIX, the  dollar
   sign  is  ignored.  If the string is translated and replaced, the replacement is double-
   quoted.

Esta é a parte correspondente da página de man do bash:

$ /bin/echo --help
Usage: /bin/echo [SHORT-OPTION]... [STRING]...
  or:  /bin/echo LONG-OPTION
Echo the STRING(s) to standard output.

  -n             do not output the trailing newline
  -e             enable interpretation of backslash escapes
  -E             disable interpretation of backslash escapes (default)
      --help     display this help and exit
      --version  output version information and exit

If -e is in effect, the following sequences are recognized:
*emphasized text*
  
$ echo $'\e[34m''COLORS'
NNN the character whose ASCII code is NNN (octal) \ backslash \a alert (BEL) \b backspace \c produce no further output \f form feed \n new line \r carriage return \t horizontal tab \v vertical tab NOTE: your shell may have its own version of echo, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supports. Report echo bugs to [email protected] GNU coreutils home page: <http://www.gnu.org/software/coreutils/> General help using GNU software: <http://www.gnu.org/gethelp/> Report echo translation bugs to <http://translationproject.org/team/>
    
por 02.09.2009 / 00:29
48

Experimente \x1B em vez de \e .

    
por 02.09.2009 / 02:29
14

O 3 ainda funciona? Se não, você pode esperançosamente pressionar Ctrl + V seguido da tecla Escape (se um mac tiver essas chaves) para criar um caractere de controle real dentro da linha de comando (o que não funciona tão bem em scripts, é claro, dependendo do editor)

    
por 01.09.2009 / 23:50
10

Uma outra maneira de imprimir seqüências de escape ANSI no shell é usando /usr/bin/printf .

    
por 01.09.2009 / 23:28
5

Para complementar a resposta útil existente com algumas informações básicas :

Se você estiver invocando echo somente nome - ao contrário do caminho, /bin/echo - você está invocando o Bash < em> builtin em vez do utilitário externo.

O comportamento de elementos Bash nativos, como builtins, é tipicamente portátil em um sentido de Bash, o que significa que eles devem funcionar da mesma forma em qualquer plataforma capaz de executar o Bash.

\e é uma exceção curiosa que afeta as versões 3.x do Bash no macOS (até hoje, a partir da versão 10.13.5 (High Sierra), o macOS vem com versões 3.x desatualizadas do Bash, por motivos legais).

\e (e seu alias \E ) deve funcionar com echo -e ; O \e support foi adicionado à echo incorporada no Bash 2.0 . , mas inexplicavelmente não na versão stock 3.x no macOS.

\e faz funcionar em versões 3.x Bash em outras plataformas, como MSYS no Windows.

Por outro lado, se você instalar e usar um Bash 4.x no macOS, o \e funciona .

    
por 26.03.2016 / 18:22
2

Eles podem tentar se adequar ao POSIX: link

A parte OPTIONS afirma entre outras coisas:

Implementations shall not support any options.
    
por 22.09.2009 / 09:45
2

FYI, estamos prestes a adicionar suporte a / bin / echo e / usr / bin / printf em coreutils. Note que os padrões C não especificam \ e, mas gcc, perl, bash, ksh e tcsh o suportam

    
por 28.10.2009 / 15:56
0

Você pode verificar se "escape de caracteres não ascii" foi desmarcado no menu de opções de visualização do terminal.app.

    
por 22.09.2009 / 09:59