Como eu canalizo a saída do diff colorido para menos?

28

Eu tenho usado o git diff, que produz saída colorida. No entanto, agora eu acho que preciso usar diff ordinário para alguma coisa, e está produzindo muita saída que é difícil de ler devido à falta de cores. Como faço para o diff produzir uma saída colorida legível? Idealmente, ao direcioná-lo para menos, para facilitar a revisão de arquivos grandes.

    
por Benubird 17.05.2013 / 18:26

3 respostas

26

diff não pode imprimir cores, você precisa de outro programa, como colordiff para isso. As cores no terminal são impressas por códigos de escape ANSI que menos não interpretam por padrão. Para obter less para mostrar cores corretamente, você precisa da -r ou, melhor ainda, da -R switch:

colordiff -- "$file1" "$file2" | less -R

De man less :

   -R or --RAW-CONTROL-CHARS
          Like -r, but only ANSI  "color"  escape  sequences  are
          output in "raw" form.  Unlike -r, the screen appearance
          is maintained correctly in most  cases.   ANSI  "color"
          escape sequences are sequences of the form:

               ESC [ ... m

          where  the  "..."  is  zero or more color specification
          characters For the purpose of keeping track  of  screen
          appearance,  ANSI color escape sequences are assumed to
          not move the cursor.  You  can  make  less  think  that
          characters  other  than  "m"  can end ANSI color escape
          sequences by setting the environment  variable  LESSAN‐
          SIENDCHARS  to  the  list of characters which can end a
          color escape sequence.  And you  can  make  less  think
          that characters other than the standard ones may appear
          between the ESC and the m by  setting  the  environment
          variable  LESSANSIMIDCHARS  to  the  list of characters
          which can appear.

Como alternativa, você pode usar more , que exibirá as cores corretamente por padrão.

Se você não pode instalar programas externos, você deve conseguir o mesmo resultado usando uma abordagem mais manual:

diff a b | 
   perl -lpe 'if(/^</){$_ = "\e[1;31m$_\e[0m"} 
              elsif(/^>/){$_ = "\e[1;34m$_\e[0m"}'
    
por 17.05.2013 / 20:03
7

Para canalizar o diff colorido para menos:

diff $file1 $file2 | colordiff | less -r

Para torná-lo mais legível, limitando-o a uma única tela:

diff -uw $file1 $file2 | colordiff | less -r

E, para fazer com que menos não seja exibido, se houver apenas uma tela valida de conteúdo:

diff -uw $file1 $file2 | tee /dev/stderr | colordiff | less -r -F

O -F faz com que menos se feche imediatamente se houver menos de uma tela de conteúdo, o pipe para stderr é porque quando menos fecha você perde a saída - por canalizar para stderr, ele obtém a saída mesmo que menos não exiba .

Uma alternativa (e, eu acho, melhor), é usar apenas -X para evitar menos limpeza da tela:

diff -uw $file1 $file2 | colordiff | less -r -X -F

Isso funciona bem para mim, mas pode ser específico para bash. O colordiff não é um built-in, mas é facilmente instalado.

    
por 17.05.2013 / 18:26
6

As outras respostas aqui podem estar desatualizadas. A partir de coreutils 3.5 diff pode realmente produzir saída colorida que é desativada por padrão quando o stdout não é um console.

Da página do manual:

--color[=WHEN]
colorize the output; WHEN can be never, always, or auto (the default)

Para forçar a saída de cores quando stdout é um pipe diff --color=always -- "$file1" "$file2" | less -R deve funcionar.

    
por 16.05.2018 / 15:21