diff
vous ne pouvez pas imprimer de couleurs, vous avez besoin d’un autre programme, par exemple colordiff
. Les couleurs dans le terminal sont imprimées via des codes d'échappement ANSI qui ne sont pas interprétés par défaut. Pour pouvoir less
afficher correctement les couleurs, vous devez utiliser le commutateur -r
, ou mieux encore -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.
Alternativement, vous pouvez utiliser more
qui affichera les couleurs correctement par défaut.
Si vous ne pouvez pas installer de programmes externes, vous devriez pouvoir obtenir le même résultat en utilisant une approche plus manuelle:
diff a b |
perl -lpe 'if(/^</){$_ = "\e[1;31m$_\e[0m"}
elsif(/^>/){$_ = "\e[1;34m$_\e[0m"}'
less -RM +Gg
: superuser.com/questions/64972/…Les autres réponses ici pourraient être obsolètes. À partir de coreutils 3.5, vous
diff
pouvez en effet produire des sorties en couleurs qui sont désactivées par défaut lorsque la sortie standard n’est pas une console.De la page de manuel:
Pour forcer la sortie couleur lorsque stdout est un tuyau, cela
diff --color=always -- "$file1" "$file2" | less -R
devrait fonctionner.la source
alias diff='diff --color=always'
dans un fichier.bashrc
ou.zshrc
.alias diff='diff --side-by-side --left-column --color=always'
alias diff='/usr/bin/diff --color=always '
etalias less='/usr/bin/less -r '
mais bien que le diff soit initialement coloré sur les premières pages de less mais sur les diffs longs, il retourne parfois en mono. Cela pourrait être sur des sauts qui n'affecteraient clairement pas diff, car sa sortie est générée une seule fois et ne doit pas nécessairement sauter, mais perd moins de traces des couleurs.Tuyau diff de couleur à moins:
Pour le rendre plus lisible, en le limitant à un seul écran:
Et, pour que moins de choses ne s'affichent pas s'il n'y a qu'un seul écran de contenu:
Le moins -F provoque la fermeture immédiate si moins d'un écran occupe le contenu, le tuyau vers stderr est parce que lorsque vous fermez moins, vous perdez la sortie - si vous passez par stderr, la sortie est sortie même si moins s'affiche.
Une solution alternative (et, je pense, meilleure) consiste à utiliser simplement -X pour éviter de moins effacer l'écran:
Cela fonctionne bien pour moi, mais pourrait être spécifique à bash. colordiff n'est pas intégré, mais s'installe facilement.
la source
less -r