Quando tento imprimir algum texto colorido usando sequências de escape ANSI por meio do echo
comando interno, parece que a \e
sequência de escape na string que forneço é interpretada literalmente em vez de como a "fuga" que deveria representar. Isso acontece apenas no Snow Leopard - os exemplos abaixo funcionam como pretendido no Leopard.
Aparentemente echo
, suporta o -e
switch, pois ele interpreta corretamente \n
ao usá-lo:
~ $
~ $ echo "\n"
\n
~ $ echo -e "\n"
~ $
Mas quando tento usar \e
, recebo o seguinte:
~ $ echo -e "\e[34mCOLORS"
\e[34mCOLORS
~ $
Como eu disse, no Leopard, o texto acima me daria a sequência "COLORS" em cores.
Alguém sabe de uma razão para que isso possa 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 Snow Leopard.
fonte
Respostas:
Não sei dizer por que ele não suporta esse argumento (talvez você precise perguntar aos programadores sobre isso). Eu só sei que na minha caixa Linux, recebo o seguinte:
\e
escapes/bin/echo
do gnu coreutils. À medida que a apple altera a fonte de seus componentes do sistema unix de tempos em tempos (por exemplo, passe de zsh para bash), verifique se houve uma alteração/bin/echo
entre o Leopard e o Snow Leopard. Se for gnu, você pode perguntar às pessoas no gnu.org por que elas optam por não incluir essas seqüências.Quanto às soluções alternativas (isso é mais interessante): Não use
/bin/echo
, mas o built-in do bashecho
funciona em caixas linux. Se eles mudaram para um bash sem eco interno (ou algo ainda mais obscuro), você também pode tentar esse recurso não conhecido do seu shell (funciona pelo menos no bash e no zsh):Esta é a parte correspondente da página de manual do bash:
fonte
$'string'
estar habilitado para a sequência de escape, obrigado.\e
não faz parte do padrão POSIX; a implementação do coreUtil GNU estendida no padrão. OS X não.Tente em
\x1B
vez de\e
.fonte
\x1B
em vez de\e
funcionar, obrigado.1B
é o valor hexadecimal do caractere Escape .Será que
\033
ainda funciona? Caso contrário, é possível pressionar Ctrl + V seguido da tecla Escape (se um mac tiver essas teclas) para criar um caractere de controle real dentro da linha de comando (o que não funciona muito bem nos scripts, é claro, dependendo do editor)fonte
\033
em vez de\e
funcionar, obrigado.33
é o valor octal do caractere Escape .033
seria uma maneira padronizada de escrever octal.Uma outra maneira de imprimir seqüências de escape ANSI no shell é usando
/usr/bin/printf
.fonte
Para complementar a resposta útil existente com algumas informações básicas :
Se você estiver invocando apenas
echo
pelo nome - e não pelo caminho/bin/echo
- , está invocando o Bash interno, e não o utilitário externo.O comportamento dos elementos nativos do Bash, como os builtins, geralmente é portátil no sentido do Bash, o que significa que eles devem funcionar da mesma maneira em qualquer plataforma capaz de executar o Bash .
\e
é uma exceção curiosa que afeta as versões 3.x Bash no macOS (até hoje, a partir da v10.13.5 (High Sierra), o macOS vem com versões 3.x desatualizadas do Bash, por motivos legais).\e
(e seu apelido\E
) deve trabalhar comecho -e
;\e
Foi adicionado suporte aoecho
built-in no Bash 2.0 . , mas inexplicavelmente não está na versão 3.x do macOS.\e
faz o trabalho em 3.x versões bash em outras plataformas, como o MSYS no Windows.Por outro lado, se você instalar e usar um 4.x Bash no MacOS,
\e
faz o trabalho.fonte
Eles podem tentar estar em conformidade com o POSIX: http://www.opengroup.org/onlinepubs/9699919799/
A parte OPTIONS declara, entre outras coisas:
fonte
-e
.Para sua informação, estamos prestes a adicionar suporte a / bin / echo e / usr / bin / printf no coreutils. Observe que os padrões C não especificam \ e, mas gcc, perl, bash, ksh e tcsh o suportam
fonte
Você pode verificar se ,, caracteres não-ascii de escape '' foram desmarcados no menu de opções de exibição do terminal.app.
fonte