¿Cómo hago 'menos' colores de salida?


25

Cuando ejecuto un programa (por ejemplo grepo ls) sin un buscapersonas, su salida es de color. Sin embargo, cuando lo ejecuto canalizando su salida a less, no se muestran colores.

Por ejemplo, este comando genera una salida en color:

grep -r something

pero esto no:

grep -r something | less

¿Por qué? ¿Cómo puedo ver los colores less?


55
grep --color=always "search string" * | less -Rpero tiendo a usar mosthoy en día en lugar de less. TAMBIÉN: gnu.org/software/src-highlite es un marcador de color (menos funciona también)
Rinzwind

@alex has instalado python-pygments?
souravc

@souravc no, no instalé eso
Mohammad Reza Rezwani

@ales ignorándome ¿estamos? >: - D
Rinzwind

Respuestas:


36

Hay dos problemas aquí:

  • Comandos como ls—que detectan automáticamente el soporte de color— no encuentran soporte de tuberías
  • less está configurado para mostrar solo los códigos de color de forma predeterminada.

Ambos se pueden superar, pero es un poco torpe:

ls --color=always | less -R

Esto no es lsespecífico. Muchos comandos que admiten color también tienen un argumento de anulación.


Una respuesta un poco más profunda lses comprobar si su STDOUT pertenece o no a un terminal real o no. Cuando se canalizan las cosas, el STDOUT se establece en el STDIN del siguiente comando.

Puede ver esto en el trabajo en el lscódigo fuente . Está utilizando el isattycomando (una interfaz POSIX central) para determinar cuál es la situación:

  • Los colores están activados por defecto:

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));
    
  • ¿Intentamos generar en varias columnas:

    if (format == long_format)
      format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
    
    //...
    
    if (isatty (STDOUT_FILENO))
      {
        format = many_per_line;
        set_quoting_style (NULL, shell_escape_quoting_style);
        qmark_funny_chars = true;
      }
    else
      {
        format = one_per_line;
        qmark_funny_chars = false;
      }
    

grephace algo muy similar, a menos que se anule explícitamente, detectará el soporte de color, con isatty:

color_option = isatty (STDOUT_FILENO) && should_colorize ();

1
Mi último voto positivo (llegó al límite) de hoy para apoyarlo por 100k. Pero yo y Rinzwind queremos pastel cuando eso suceda.
hytromo

Descargué un programa con el nombre era ack-grep. cuando escriba ack-grep foo, buscará foo en todos los subdirectorios. Así que hice ack-grep foo | menos, y los colores se fueron. Pero parece que este programa no es compatible con "--color = always", lo que sea gracias por la ayuda
Mohammad Reza Rezwani

1
@alex ack tiene un --colorargumento:ack-grep -i select --color | less -R
Oli

@Oli ......... Oh, Dios mío ........ lo único que puedo decir sobre tu conocimiento y ayuda y también sobre el poder de Linux
Mohammad Reza Rezwani

1
@ B1KMusic Estoy de acuerdo. Estoy de acuerdo tanto que me encontré la forma cómo funciona y actualiza la respuesta. Puede forzar columnas con un -Cargumento.
Oli

2

Si está interesado en los colores en lessgeneral, es posible que desee mirar lesspipe.sh. Ver, por ejemplo, http://freecode.com/projects/lesspipe .

lesspipe.sh es un filtro de entrada para el localizador less como se describe en la página de manual de less. El script se ejecuta bajo un shell compatible con ksh (por ejemplo, bash, zsh) y le permite usar menos para ver archivos con contenido binario, archivos comprimidos, archivos y archivos contenidos en archivos.

También coloreará los scripts de shell, scripts de Perl, etc. de manera similar a un editor de texto, pero sin el uso de ningún programa de "preprocesamiento" para colorear.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.