Como faço para criar menos cores de saída?

Como faço para criar menos cores de saída?

Quando executo um programa (por exemplo grepou ls) sem pager, sua saída é colorida. No entanto, quando eu executo a saída less, nenhuma cor é mostrada.

Por exemplo, este comando gera uma saída colorida:

grep -r something

mas isso não acontece:

grep -r something | less

Por que? Como posso ver as cores less?

Responder1

Existem dois problemas aqui:

  • Comandos como ls—que detectam automaticamente o suporte de cores— não encontram suporte em pipes
  • lessestá configurado para exibir apenas códigos de cores por padrão.

Ambos podem ser superados, mas é um pouco desajeitado:

ls --color=always | less -R

Isso não é lsespecífico. Muitos comandos que suportam cores também possuem um argumento de substituição.


Uma resposta um pouco mais aprofundada é lsverificar se seu STDOUT pertence ou não a um terminal real. Quando você canaliza as coisas, o STDOUT é definido como o STDIN do próximo comando.

Você pode ver isso no trabalhono lscódigo fonte. Ele está usando o isattycomando (uma interface POSIX principal) para descobrir qual é a situação:

  • As cores estão ativadas por padrão:

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));
    
  • Tentamos produzir em várias colunas:

    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;
      }
    

grepfaz algo muito semelhante, a menos que seja explicitamente substituído, detectará suporte a cores, com isatty:

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

Responder2

Se você estiver interessado em cores de lessmaneira mais geral, você pode querer dar uma olhada em lesspipe.sh. Veja, por exemplo,https://github.com/wofr06/lesspipe.

lesspipe.sh é um filtro de entrada para o pager less conforme descrito na página man de less. O script é executado em um shell compatível com ksh (por exemplo, bash, zsh) e permite usar less para visualizar arquivos com conteúdo binário, arquivos compactados, arquivos e arquivos contidos em arquivos.

Ele também irá colorir scripts shell, scripts perl, etc. de forma semelhante a um editor de texto, mas sem o uso de qualquer programa de "pré-processamento" para fazer a coloração.

Responder3

A resposta de @oli depende de você ser capaz de fornecer sinalizadores apropriados ao comando que produz as cores. Isso pode ser difícil se os comandos estiverem enterrados em scripts e similares, e requer descobrir como fornecer sinalizadores apropriados separadamente para vários comandos que sabem como produzir escapes ANSI quando o ambiente do terminal diz que podem.

A resposta de @DaveEmme diz que você pode usar lesspipe para colorir a saída de qualquer fonte, mas até onde eu sei, ele não reterá a cor dos comandos que já a produzem quando a saída for para o terminal.

Se você já possui um comando que funciona bem em seu terminal, é bom poder executar esse comando de forma que os escapes de cores sejam mantidos independentemente da saída que está sendo canalizada, para que você possa alimentá-lo no less -R.

unbufferfaz isso por você. No debian, pelo menos, você consegue isso com sudo apt install expect-dev.

Você pode então fazer:

unbuffer [command] |& less -R

Usar |&em vez de |pode ser um detalhe desnecessário, mas significa que STDERR é canalizado para menos, assim como STDOUT.

Graças ahttps://superuser.com/a/1260695/229226por esta.

informação relacionada