diff
não pode produzir cores, você precisa de outro programa, como colordiff
para isso. As cores no terminal são impressas por meio de códigos de escape ANSI que menos não interpretam por padrão. Para less
mostrar corretamente as cores, você precisa da opção -r
, ou melhor ainda, de -R
:
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 o more
que exibirá as cores corretamente por padrão.
Se você não conseguir instalar programas externos, poderá obter a mesma saída usando uma abordagem mais manual:
diff a b |
perl -lpe 'if(/^</){$_ = "\e[1;31m$_\e[0m"}
elsif(/^>/){$_ = "\e[1;34m$_\e[0m"}'
less -RM +Gg
: superuser.com/questions/64972/…As outras respostas aqui podem estar desatualizadas. A partir do coreutils 3.5, de
diff
fato, é possível produzir uma saída colorida que é desativada por padrão quando o stdout não é um console.Na página do manual:
Forçar a saída de cores quando stdout é um tubo
diff --color=always -- "$file1" "$file2" | less -R
deve funcionar.fonte
alias diff='diff --color=always'
em um arquivo.bashrc
ou.zshrc
.alias diff='diff --side-by-side --left-column --color=always'
alias diff='/usr/bin/diff --color=always '
e,alias less='/usr/bin/less -r '
embora o diff seja inicialmente colorido nas primeiras páginas de menos mas em diffs longos, às vezes ele volta ao mono. Isso pode ocorrer em saltos que claramente não afetariam o diff, uma vez que sua saída é gerada apenas uma vez e não precisa ser saltada, mas de alguma forma menos perde o controle das cores.Para canalizar diff colorido para menos:
Para torná-lo mais legível, limitando-o a uma única tela:
E, para fazer com que menos não seja exibido se houver apenas uma tela com conteúdo:
O -F faz com que menos feche imediatamente se houver menos de uma tela com conteúdo, o canal para stderr ocorre porque quando menos fecha você perde a saída - ao canalizar para stderr, ele obtém saída mesmo que menos não seja exibido.
Uma maneira alternativa (e, na minha opinião, melhor) é usar apenas -X para evitar menos limpeza da tela:
Isso funciona bem para mim, mas pode ser específico para o bash. O colordiff não é um built-in, mas é facilmente instalado.
fonte
less -r