¿Cómo puedo crear "menos" colores de salida?

¿Cómo puedo crear "menos" colores de salida?

Cuando ejecuto un programa (por ejemplo grepo ls) sin un buscapersonas, su salida aparece en color. Sin embargo, cuando lo ejecuto canalizando su salida 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?

Respuesta1

Hay dos problemas aquí:

  • Comandos como ls, que detectan automáticamente el soporte de color, no encuentran soporte en las tuberías.
  • lessestá configurado para mostrar solo códigos de color de forma predeterminada.

Ambos se pueden superar pero es un poco complicado:

ls --color=always | less -R

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


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

Puedes 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:

  • ¿Están los colores activados de forma predeterminada?

        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á compatibilidad con colores, con isatty:

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

Respuesta2

Si está interesado en los colores en lesstérminos más generales, es posible que desee consultar lesspipe.sh. Véase, por ejemplo,https://github.com/wofr06/lesspipe.

lesspipe.sh es un filtro de entrada para el buscapersonas 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 less para ver archivos con contenido binario, archivos comprimidos, archivos y archivos contenidos en archivos.

También coloreará 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.

Respuesta3

La respuesta de @oli depende de que usted pueda proporcionar indicadores apropiados al comando que produce los colores. Esto puede ser difícil si los comandos están enterrados en scripts y similares, y requiere descubrir cómo proporcionar indicadores apropiados por separado para varios comandos que sepan cómo producir escapes ANSI cuando el entorno del terminal así lo indique.

La respuesta de @DaveEmme te dice que puedes usar lesspipe para colorear la salida de cualquier fuente, pero hasta donde yo sé, no retendrá el color de los comandos que ya lo producen cuando la salida llega al terminal.

Si ya tiene un comando que funciona bien en su terminal, entonces es bueno poder ejecutar ese comando de tal manera que los escapes de color se mantengan independientemente de la salida que se canalice, para que pueda introducirlo en less -R.

unbufferhace esto por ti. En Debian al menos lo obtienes con sudo apt install expect-dev.

Luego puedes hacer:

unbuffer [command] |& less -R

Usar |&en lugar de |puede ser un detalle innecesario, pero significa que STDERR se canaliza a menos tan bien como STDOUT.

Gracias ahttps://superuser.com/a/1260695/229226para esto.

información relacionada