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

20

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

Por ejemplo, este comando genera resultados coloreados:

grep -r something

pero esto no:

grep -r something | less

¿Por qué? ¿Cómo puedo ver los colores a través de less ?

    
pregunta Mohammad Reza Rezwani 13.06.2014 - 13:57

2 respuestas

31

Aquí hay dos problemas:

  • Comandos como ls -que detectan automáticamente el soporte de color- no encuentran soporte de los tubos
  • less está configurado para mostrar códigos de color de forma predeterminada.

Ambos pueden superarse, pero es un poco torpe:

ls --color=always | less -R

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

Una respuesta un poco más profunda es que ls está verificando si su STDOUT pertenece o no a un terminal real. Cuando canalizas las cosas, el STDOUT se establece en el STDIN del siguiente comando.

Puedes ver esto en el trabajo en el código fuente ls . Está utilizando el comando isatty (una interfaz Core POSIX) para resolver cuál es la situación:

  • Los colores están activados de forma predeterminada:

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));
    
  • ¿Intentamos generar resultados 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;
      }
    

grep hace una cosa muy similar, a menos que se anule explícitamente, detectará soporte de color, con isatty :

color_option = isatty (STDOUT_FILENO) && should_colorize ();
    
respondido por el Oli 13.06.2014 - 14:49
2

Si le interesan los colores en less más generalmente, le recomendamos mirar lesspipe.sh . Ver, por ejemplo, enlace .

  

lesspipe.sh es un filtro de entrada para el buscapersonas menos que el descrito en la página man de less. La secuencia de comandos se ejecuta en 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 los archivos.

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

    
respondido por el DaveEmme 13.06.2014 - 19:11

Lea otras preguntas en las etiquetas