Como faço para produzir menos cores?


25

Quando executo um programa (por exemplo grepou ls) sem um pager, sua saída é colorida. No entanto, quando eu o executo, direcionando sua saída para 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 quê? Como posso ver as cores less?


5
grep --color=always "search string" * | less -Rmas eu costumo usar mosthoje em vez de less. TAMBÉM: gnu.org/software/src-highlite é um marcador de cor (menos obras também)
Rinzwind

@alex você instalou python-pygments?
souravc

@souravc não, eu não instalei isso
Mohammad Reza Rezwani

@ales me ignorando, estamos? >: - D
Rinzwind

Respostas:


36

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 códigos de cores por padrão.

Ambos podem ser superados, mas é um pouco desajeitado:

ls --color=always | less -R

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


Uma resposta um pouco mais profunda lsé verificar se o 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 funcionando no lscódigo fonte . Está usando oisatty comando (uma interface principal do POSIX) 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 uma coisa muito semelhante, a menos que seja explicitamente substituído, ele detectará o suporte de cores, com isatty:

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

1
Meu último voto positivo (atingiu o limite) de hoje para apoiá-lo por 100k. Mas eu e Rinzwind queremos bolo quando isso acontece.
hytromo

Eu baixei um programa com o nome foi ack-grep. quando digitar ack-grep foo, ele procurará foo em todos os subdiretórios.So eu fiz ack-grep foo | menos, e as cores desapareceram. Mas parece que este programa não suporta "--color = always", o que quer que seja obrigado pela ajuda #
Mohammad Reza Rezwani

1
@alex ack tem um --colorargumento:ack-grep -i select --color | less -R
Oli

@Oli ......... Oh meu Deus ........ a única coisa que posso dizer sobre o seu conhecimento e ajuda e também poder do linux
Mohammad Reza Rezwani

1
@ B1KMusic Eu concordo. Concordo tanto que eu encontrei como como ele funciona e atualizei a resposta. Você pode forçar colunas com um -Cargumento.
Oli

2

Se você estiver interessado em cores de uma maneira lessmais geral, talvez queira dar uma olhada lesspipe.sh. Veja, por exemplo, http://freecode.com/projects/lesspipe .

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.