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

19

Quando executo um programa (por exemplo grep ou ls ) sem um pager, sua saída é colorida. No entanto, quando eu o executo, canalizando sua saída para less , nenhuma cor é mostrada.

Por exemplo, este comando gera saída colorida:

grep -r something

mas isso não acontece:

grep -r something | less

Por quê? Como posso ver as cores em less ?

    
por Mohammad Reza Rezwani 13.06.2014 / 15:57

2 respostas

31

Existem dois problemas aqui:

  • Comandos como ls - que detectam automaticamente o suporte de cores - não encontram suporte de pipes
  • less está definido para exibir apenas os códigos de cores por padrão.

Ambos podem ser superados, mas é um pouco desajeitado:

ls --color=always | less -R

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

Uma resposta um pouco mais profunda é que ls está verificando se seu STDOUT pertence ou não a um terminal real. Quando você canaliza as coisas, o STDOUT é definido para o STDIN do próximo comando.

Você pode ver isso no trabalho no código-fonte ls . Ele está usando o comando isatty (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)));
    
  • Nós 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;
      }
    

grep faz uma coisa muito semelhante, a menos que seja explicitamente substituído, ele detectará o suporte a cores, com isatty :

color_option = isatty (STDOUT_FILENO) && should_colorize ();
    
por Oli 13.06.2014 / 16:49
2

Se você estiver interessado em cores em less mais geralmente, talvez queira ver lesspipe.sh . Veja, por exemplo, link .

  

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

Ele também irá colorir scripts de shell, scripts perl, etc., similarmente a um editor de texto, mas sem o uso de nenhum programa de "pré-processamento" para fazer o colorizing.

    
por DaveEmme 13.06.2014 / 21:11