¿A dónde van mis códigos de escape ANSI cuando canalizo a otro proceso? ¿Me los puedo quedar?

36

A veces quiero canalizar la salida codificada por colores para un proceso, por ejemplo. grep ... pero cuando lo canalizo a otro proceso, por ejemplo. sed, los códigos de color se pierden ...

¿Es la forma de mantener intactos estos códigos?

Aquí hay un ejemplo que pierde la salida coloreada:

echo barney | grep barney | sed -n 1,$\ p   
Peter.O
fuente
44
PD ... como información general ... acabo de descubrir que lesspuede aceptar entradas de texto coloreadas (agradable :) ... por ejemplo: tree -C ~/ |less -Rols -lR --color=always . |less -R
Peter.O

Respuestas:

40

Muchos programas que generan resultados en color detectan si están escribiendo en un TTY y desactivan los colores si no lo están. Esto se debe a que los códigos de color son molestos cuando solo desea capturar el texto, por lo que intentan "hacer lo correcto" automáticamente.

La forma más sencilla de capturar la salida de color de un programa como ese es decirle que escriba color aunque no esté conectado a un TTY. Tendrá que leer la documentación del programa para averiguar si tiene esa opción. (por ejemplo, greptiene la --color=alwaysopción).

También puede usar el expectscript unbufferpara crear un pseudo-tty como este:

echo barney | unbuffer grep barney | sed -n 1,$\ p
cjm
fuente
2
¡Gracias por esa información sobre la detección de TTY y la falsificación de unbuffer!
shellter
@cjm ... No funciona aquí (en Ubuntu 10.04 / bash 4.1.5) ... pero mi repositorio 10.04 solo tiene una versión -dev, y nada en backports ... Es un poco tarde aquí, así que buscaré mañana otra vez ... pero como has dicho, estos programas de coloración probablemente cambian de acuerdo con el destino de salida (mhhh, pero ¿cómo saben que va a ser tty ... no importa) ... y bien pueden tener una opción para forzar it .. thanks ,,,
Peter.O
@fred, generalmente usan isatty para averiguar a dónde stdoutva. En realidad, no estoy seguro de si unbufferfunciona cuando estás entrando en el programa y fuera de él; No lo tengo instalado aquí para probar.
cjm
gracias por la unbufferinformación, ayuda a la salida de mi bot IRC como la salida en shell.
LiuYan 刘 研
4

Esto funciona para mi ;-! (en el entorno MingW actual)

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

# barney se muestra como texto rojo

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1
cáscara
fuente
@shellter ... sí, este ejemplo grep en particular también funciona para mí ... No estaba al tanto de esa opción hasta que publicaste la respuesta, así que gracias por eso ... Sin embargo. Todavía me pregunto si hay alguna forma general de hacer esto ... por ejemplo tree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ... Tal vez (?) Hay una manera de engañar a una tubería para que piense que se está enviando a un TTY ... o alguna solución general. .
Peter.O
Acabo de comprobar man tree... También tiene una opción similar, -C... tal vez es una característica común para los programas que
generan