2011-11-22 17 views
5

Tengo un script que usa códigos de escape para resaltar las coincidencias de texto en su salida. Todo está bien, excepto cuando la salida se canaliza a less, que imprime los códigos de escapebash - códigos de escape de color

, p.

$ echo -e "\033[31m -- Hello World! -- \033[m" 
-- Hello World! -- 

Hilo a less:

$ echo -e "\033[31m -- Hello World! -- \033[m" | less 
ESC[31m -- Hello World! -- ESC[m 

Me preguntaba cómo otras herramientas como ls, grep, etc, son capaces de salida de color, sin embargo, se ve bien cuando se canaliza a less?

Respuesta

5

La mayoría de las herramientas que menciona llaman a la función C isatty() que determina si el descriptor de archivo relevante (en este caso stdout) del proceso va a un terminal.

Si la salida es para un terminal, habilita el color, resalta, emite sonidos o cualquier otra característica de la que piense que un usuario humano obtendría un valor. Si no hay una terminal, generan texto sin procesar para la digestión de otras herramientas.

Cuando se escribe

grep -v "Dogs" list-of-animals | less 

La llamada isatty() de grep se ejecuta en el descriptor de archivo que conduce a la tubería, no su terminal. Por lo tanto, devuelve cero, errno se establece en EINVAL o ENOTTY y grep genera texto sin formato adecuado para menos.

+0

Lo tengo. Gracias por la explicación. – armandino

6

grep y sus amigos detectan si la salida es a un terminal. Cuando se canaliza a menos, no lo es, por lo que desactivan el color.

Consulte isatty para verificar si la salida es una terminal.

Tenga en cuenta que a veces me encuentro esto muy molesto porque I quiero menos para mostrar los colores:

alias less='less -SR' 
alias grep='grep --color=always' 

También se fijan en ANSIFilter para la inversa: para filtrar ANSI escapa fuera del existente transmisiones (también puede usarlas para producir HTML, RTF y posiblemente otros formatos)

2

Si desea permitir que pase menos secuencias de escape de color al terminal:

> echo -e "\033[31m -- Hello World! -- \033[m" | less -R

... o si desea pasar todas las secuencias de escape:

> echo -e "\033[31m -- Hello World! -- \033[m" | less -r

+0

+1 :-) también: google "ansi escape codes", y: http://www.linuxfocus.org/English/May2004/article335.shtml – Tilo

9

Uso less -R o añadir LESS=-R con el medio ambiente. Esto solicita que less pase algunas secuencias de escape (como el color) al terminal en lugar de imprimirlas como caracteres normales.

+0

esto es exactamente lo que estaba buscando gracias. – jimh

Cuestiones relacionadas