diff
no puede generar colores, necesita otro programa, como colordiff
para eso. Los colores en el terminal se imprimen a través de códigos de escape ANSI que menos no se interpretan por defecto. Para less
mostrar correctamente los colores, necesita el interruptor -r
, o incluso mejor, -R
cambiar:
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.
Alternativamente, puede usar el more
que mostrará los colores correctamente de forma predeterminada.
Si no puede instalar programas externos, debería poder obtener el mismo resultado utilizando un enfoque más 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/...Las otras respuestas aquí pueden estar desactualizadas. A partir de coreutils 3.5
diff
, de hecho, puede producir una salida en color que está desactivada por defecto cuando el stdout no es una consola.Desde la página del manual:
Para forzar la salida de color cuando stdout es una tubería,
diff --color=always -- "$file1" "$file2" | less -R
debería funcionar.fuente
alias diff='diff --color=always'
en un archivo.bashrc
o.zshrc
.alias diff='diff --side-by-side --left-column --color=always'
alias diff='/usr/bin/diff --color=always '
y,alias less='/usr/bin/less -r '
aunque el diff se colorea inicialmente en las primeras páginas de menos pero en los diff largos, a veces vuelve a mono. Esto podría ser en saltos que claramente no afectarían a diff, ya que su salida solo se genera una vez y no tiene que saltar, pero de alguna manera pierde menos rastro de los colores.Para canalizar diff de color a menos:
Para hacerlo más legible, limitándolo a una sola pantalla:
Y, para que no se muestre menos si solo hay una pantalla de contenido:
La -F hace que se cierre menos inmediatamente si hay menos de una pantalla con contenido, la tubería a stderr se debe a que cuando cierra menos, pierde la salida: al canalizar a stderr, obtiene salida incluso si no se muestra menos.
Una forma alternativa (y creo que mejor) es usar -X para evitar que se borre menos la pantalla:
Esto funciona bien para mí, pero podría ser específico de bash. El colordiff no está incorporado, pero se instala fácilmente.
fuente
less -r