Où vont mes codes d'échappement ANSI lorsque je passe à un autre processus? Puis-je les garder?

36

Je veux parfois canaliser la sortie codée par couleur d'un processus, par exemple. grep ... mais quand je le dirige vers un autre processus, par exemple. sed, les codes de couleur sont perdus ...

Est-il possible de garder ces codes intacts?

Voici un exemple qui perd la sortie colorée:

echo barney | grep barney | sed -n 1,$\ p   
Peter.O
la source
4
PS .. comme informations générales .. Je viens de découvrir que lesspeut accepter la saisie de texte en couleur (nice :) ... par exemple: tree -C ~/ |less -Rouls -lR --color=always . |less -R
Peter.O

Réponses:

40

De nombreux programmes qui génèrent une sortie couleur détectent s'ils écrivent sur un ATS et désactivent les couleurs s'ils ne le sont pas. Cela est dû au fait que les codes de couleur sont gênants lorsque vous souhaitez uniquement capturer le texte. Ils essaient donc de "faire ce qui est bien" automatiquement.

Le moyen le plus simple de capturer la sortie couleur d’un programme comme celui-ci consiste à lui dire d’écrire en couleur même s’il n’est pas connecté à un téléscripteur. Vous devrez lire la documentation du programme pour savoir s'il dispose de cette option. (par exemple, grepa l' --color=alwaysoption.)

Vous pouvez également utiliser le expectscript unbufferpour créer un pseudo-tty comme ceci:

echo barney | unbuffer grep barney | sed -n 1,$\ p
cjm
la source
2
merci pour cette information à propos de la détection TTY et du faux tampon!
shellter
@cjm .. Cela ne marche pas ici (sur Ubuntu 10.04 / bash 4.1.5) ... mais mon repo 10.04 a seulement une version -dev, et rien dans les backports ... Il est un peu tard ici, alors je vais regarder encore une fois demain ... mais comme vous l'avez dit, ces programmes de colorisation basculent probablement en fonction de la destination de sortie (mhhh mais comment savent-ils que cela va aller à tty..Aucune matière) .. et ils pourraient bien avoir une option pour forcer it .. merci ,,,
Peter.O
@fred, ils utilisent généralement isatty pour savoir où ils stdoutvont. En fait, je ne suis pas sûr que cela unbufferfonctionne si vous participez ou non au programme. Je ne l'ai pas installé ici pour essayer.
cjm
merci pour l' unbufferinformation, cela aide la sortie de mon bot IRC comme la sortie dans le shell.
LiuYan
4

Ça marche pour moi ;-! (dans l'environnement MingW actuel)

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

# barney est affiché en rouge

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1
pilon
la source
@shellter ... oui, cet exemple de grep fonctionne également pour moi .. Je ne connaissais pas cette option jusqu'à ce que vous ayez posté la réponse, alors merci pour cela ... Cependant. Je me demande encore s'il existe un moyen général de le faire ... par exemple tree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ... Peut-être (?) Pourrait-il tromper un tuyau en lui faisant croire qu'il est transmis à un ATS ... ou à une solution de contournement générale similaire. .
Peter.O
Je viens de vérifier man tree... Il existe également une option similaire, -C... peut-être est-ce une caractéristique commune aux programmes
générant des