¿Qué hace el interruptor grep --color = auto?

8

¿Qué efecto tiene autocomo opción para el --colorinterruptor en grep? ¿Cuándo grep decide colorear las cadenas coincidentes y cuándo no?

Trolzen
fuente

Respuestas:

12

Comportamiento esperado

Con --color=auto, grep resaltará las cadenas coincidentes si (y solo si) la salida se escribe directamente en el terminal y dicho terminal es capaz de mostrar una salida en color.

Normalmente, --color=autoes lo que quieres. Si, por ejemplo, usa grep para hacer coincidir una URL y canalizarla a Wget, Wget verá en \e[1;31mhttp://...lugar de la URL real (y se ahogará).

Los siguientes comandos deberían dar como resultado una salida en color:

echo Super User | grep --color=auto Super
echo Super User | grep --color=always Super | cat

Este comando, sin embargo, no debe:

echo Super User | grep --color=auto Super | cat

Cualquier inconsistencia con este comportamiento debe considerarse un error.

Código fuente

Con --color=autola última versión de Grep para Windows (2.5.4), así como la 2.5.4 original en la que se basa, colorea la salida si y solo si la condición

isatty(STDOUT_FILENO) && getenv("TERM") && strcmp(getenv("TERM"), "dumb")

es verdadero, es decir, si y solo si la salida se está escribiendo en un terminal, la variable de entornoTERM está definida y el terminal no es tonto .

Esto no producirá el comportamiento deseado en Windows, ya TERMque normalmente no está definido. Una solución fácil a este problema es configurarlo TERM=windowsen el panel de control.

La última versión de grep (2.14) soluciona este problema coloreando el resultado si y solo si la condición

isatty(STDOUT_FILENO) && should_colorize()

es cierto, donde should_colorize()se define de manera diferente para POSIX y Win32:

Para el primero, la condición es equivalente a la de 2.5.4; para este último, la variable de entorno TERMno tiene que establecerse (simplemente no puede ser dumb).

Dennis
fuente
¿Cómo se entera si escribe en el terminal o no?
Trolzen
1
Hay una función C para eso. Si incluye el archivo de encabezado sdgstd.h, istty(stdout)devuelve 0si la salida se redirige a un archivo.
Dennis
Experimento I con puertos de ventanas grepy lessde proyecto GNUWin (gnuwin32.sourceforge.net). cmd.exeSe mejora con la ansiconutilidad. less --color=autofunciona como se espera: usa el color cuando no se aplica la redirección y no cuando la salida se redirige. Pero grep --color=autono imprime secuencias de escape en ambos casos.
Trolzen
No puedo entender por qué sucede esto. Pensé que estas utilidades tienen el mismo código tanto en las versiones de Unix como de Windows y son bastante antiguas. Entonces deberían comportarse de manera idéntica.
Trolzen
Eso es un error en grep de GnuWin32 entonces. En Ubuntu, se comporta como detallé en mi respuesta. Si bien ambos se derivan del mismo código fuente, siempre hay que realizar pequeños ajustes si va a compilar en otra plataforma. Además, tenga en cuenta que la versión actual de grep de GnuWin32 es 2.5.4. La última versión en Ubuntu es 2.12.
Dennis