Cum pot să conduc ieșirea dif colorată către less? (Unix, Culori, Diff, Less)

Benubird a intrebat.

Am folosit git diff, care produce o ieșire colorată. Cu toate acestea, acum am descoperit că trebuie să folosesc diff obișnuit pentru ceva, iar acesta produce o mulțime de rezultate greu de citit din cauza lipsei de culori. Cum pot face ca diff să producă o ieșire lizibilă și colorată? În mod ideal, în timp ce o trimit către less, pentru o revizuire ușoară a fișierelor mari.

4 răspunsuri
terdon

diff nu poate ieși în culori, aveți nevoie de un alt program, cum ar fi colordiff pentru asta. Culorile în terminal sunt tipărite prin coduri de scăpare ANSI pe care less nu le interpretează în mod implicit. Pentru a obține less să afișeze corect culorile, aveți nevoie de -r, , sau chiar mai bine, -R comutator:

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

De la 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.

Alternativ, puteți folosi more care va afișa culorile corect în mod implicit.


Dacă nu puteți instala programe externe, ar trebui să puteți obține același rezultat folosind o abordare mai manuală:

diff a b | 
   perl -lpe 'if(/^</){$_ = "e[1;31m$_e[0m"} 
              elsif(/^>/){$_ = "e[1;34m$_e[0m"}'

Comentarii

Kshitiz Sharma

Celelalte răspunsuri de aici ar putea fi depășite. Începând cu coreutils 3.5 diff poate produce într-adevăr o ieșire colorată care este dezactivată în mod implicit atunci când stdout nu este o consolă.

Din pagina de manual:

--color[=WHEN]
colorize the output; WHEN poate fi never, , always, , sau auto (implicit)

Pentru a forța ieșirea colorată atunci când stdout este o țeavă diff --color=always -- "$file1" "$file2" | less -R ar trebui să funcționeze.

Comentarii

  • De asemenea, puteți include alias diff='diff --color=always' într-un fișier .bashrc sau .zshrc fișier. –  > Por jftuga.
  • Da, folosesc alias diff='diff --side-by-side --left-column --color=always' –  > Por Kshitiz Sharma.
  • Eu folosesc alias diff='/usr/bin/diff --color=always ' și alias less='/usr/bin/less -r ' dar, deși diferența este inițial colorată pe primele câteva pagini de mai puțin, dar la diferențele lungi, uneori revine la mono. Acest lucru ar putea fi în cazul salturilor care, în mod clar, nu ar afecta diff, deoarece ieșirea sa este generată o singură dată și nu trebuie să sară, dar cumva less pierde urma culorilor. –  > Por NeilG.
Benubird

Pentru a direcționa diff colorat către less:

diff $file1 $file2 | colordiff | less -r

Pentru a-l face mai ușor de citit, limitându-l la un singur ecran:

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

Și pentru a face ca less să nu se afișeze dacă există doar un singur ecran de conținut:

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

F face ca less să se închidă imediat dacă există mai puțin de un ecran de conținut, iar trimiterea la stderr se datorează faptului că atunci când less se închide, pierdeți ieșirea – prin trimiterea la stderr, se obține ieșirea chiar dacă less nu se afișează.

O modalitate alternativă (și, cred eu, mai bună) este să folosiți doar -X pentru a împiedica less să curețe ecranul:

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

Acest lucru funcționează bine pentru mine, dar ar putea fi specific pentru bash. colordiff nu este un built-in, dar este ușor de instalat.

Comentarii

  • Singura comandă de care are nevoie este less -r –  > Por sendmoreinfo.
Johan Walles

Eu aș folosi riff:

diff "$A" "$B" | riff

Riff nu numai că vă spune ce linii s-au schimbat, ci și ce părți din liniile care s-au schimbat (a se vedea captura de ecran de mai jos).

Riff utilizează în mod implicit paginarea ieșirii în același mod în care git o face, deci nu trebuie să vă faceți griji cu privire la integrarea pagerului.

În plus, Riff se integrează cu git astfel încât puteți obține această ieșire din git diff și de la prietenii săi, de asemenea.

Obțineți-l aici: https://github.com/walles/riff/releases/

Disclaimer: Am scris riff eu însumi, așa că bineînțeles că îl recomand :).