Para onde meus códigos de escape ANSI vão quando canalizo para outro processo? Posso mantê-los?

30

Eu às vezes quero canalizar a saída codificada por cores para um processo, por exemplo. grep ... mas quando eu canalizo para outro processo, por exemplo. sed, os códigos de cores são perdidos ...

É alguma maneira de manter os códigos intactos?

Aqui está um exemplo que perde a saída colorida:

echo barney | grep barney | sed -n 1,$\ p   
    
por Peter.O 07.04.2011 / 14:37

2 respostas

33

Muitos programas que geram saída colorida detectam se estão gravando em um TTY, e desativam cores se não estiverem. Isso ocorre porque os códigos de cores são irritantes quando você quer apenas capturar o texto, então eles tentam "fazer a coisa certa" automaticamente.

A maneira mais simples de capturar a saída de cores de um programa como esse é dizer a ele para escrever cores, mesmo que não esteja conectado a um TTY. Você terá que ler a documentação do programa para descobrir se tem essa opção. (por exemplo, grep tem a opção --color=always .)

Você também pode usar o script expect unbuffer para criar um pseudo-tty assim:

echo barney | unbuffer grep barney | sed -n 1,$\ p
    
por 07.04.2011 / 17:30
3

Funciona para mim; (no ambiente atual do MingW)

echo barney | grep --color=always barney | sed -n '1,$p'
**barney**

# barney é exibido como texto vermelho

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1
    
por 07.04.2011 / 15:59