Para onde vão meus códigos de escape ANSI quando canalizo para outro processo? Posso ficar com eles?

36

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

Existe alguma maneira de manter esses códigos intactos?

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

echo barney | grep barney | sed -n 1,$\ p   
Peter.O
fonte
4
PS .. como informação geral .. Eu só descobri que lessa entrada pode aceitar colorizado texto (nice :) ... por exemplo: tree -C ~/ |less -Rouls -lR --color=always . |less -R
Peter.O

Respostas:

40

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

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

Você também pode usar o expectscript unbufferpara criar um pseudo-tty como este:

echo barney | unbuffer grep barney | sed -n 1,$\ p
cjm
fonte
2
obrigado por essa informação sobre a detecção de TTY e a falsificação sem buffer!
shellter
@cjm .. Não está funcionando aqui (no Ubuntu 10.04 / bash 4.1.5) ... mas meu repositório 10.04 tem apenas uma versão -dev, e nada em backports ... É um pouco tarde aqui, então vou procurar novamente amanhã ... mas, como você disse, esses programas de coloração provavelmente alternam de acordo com o destino da saída (mhhh, mas como eles sabem que é demais para tty..não importa) .. e eles podem ter uma opção para forçar -lo .. graças ,,,
Peter.O
@fred, eles geralmente usam o isatty para descobrir para onde stdoutestá indo. Na verdade, não tenho certeza se unbufferfunciona quando você está entrando no programa e fora dele; Não o tenho instalado aqui para tentar.
CJM
obrigado pelas unbufferinformações, ele ajuda a saída do meu bot de IRC como a saída no shell.
Liuyan刘研
4

Funciona para mim ;-! (no ambiente atual do MingW)

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

# barney é exibido como texto em vermelho

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1
shellter
fonte
@ shellter ... sim, este exemplo grep em particular também funciona para mim .. Eu não estava ciente dessa opção até você postar a resposta, então obrigado por isso ... No entanto. Ainda estou me perguntando se existe alguma maneira geral de fazer isso .... por exemplo tree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ... Talvez (?) Exista uma maneira de enganar um canal para pensar que está sendo transmitido para um TTY ... ou para alguma solução geral desse tipo. .
Peter.O
Eu verifiquei apenas man tree... Ele também tem uma opção semelhante, -C... talvez seja uma característica comum para os programas que códigos de escape de cor de saída ..
Peter.O