Come posso rendere i colori di output `meno`?


25

Quando eseguo un programma (ad esempio grepo ls) senza un cercapersone, il suo output è colorato. Tuttavia, quando lo eseguo eseguendo il piping del suo output less, non viene mostrato alcun colore.

Ad esempio, questo comando genera un output colorato:

grep -r something

ma questo non:

grep -r something | less

Perché? Come posso vedere i colori less?


5
grep --color=always "search string" * | less -Rma mostoggi tendo a usarlo invece di less. ANCHE: gnu.org/software/src-highlite è un evidenziatore di colori (anche meno opere)
Rinzwind

@alex hai installato python-pygments?
souravc,

@souravc no Non l'ho installato
Mohammad Reza Rezwani,

@ales ignorandoci, vero? >: - D
Rinzwind,

Risposte:


36

Ci sono due problemi qui:

  • I comandi come ls—che rilevano automaticamente il supporto colore — non trovano supporto dai tubi
  • less è impostato per visualizzare solo i codici colore per impostazione predefinita.

Entrambi possono essere superati ma è un po 'goffo:

ls --color=always | less -R

Questo non è lsspecifico. Molti comandi che supportano il colore hanno anche un argomento override.


Una risposta leggermente più approfondita è quella di lsverificare se il suo STDOUT appartiene o meno a un terminale reale o meno. Quando si tracciano le cose, STDOUT è impostato su STDIN del comando successivo.

Puoi vederlo al lavoro nel lscodice sorgente . Sta usando il isattycomando (un'interfaccia POSIX di base) per capire qual è la situazione:

  • I colori sono attivi per impostazione predefinita:

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));
    
  • Proviamo a produrre in più colonne:

    if (format == long_format)
      format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
    
    //...
    
    if (isatty (STDOUT_FILENO))
      {
        format = many_per_line;
        set_quoting_style (NULL, shell_escape_quoting_style);
        qmark_funny_chars = true;
      }
    else
      {
        format = one_per_line;
        qmark_funny_chars = false;
      }
    

grepfa una cosa molto simile, a meno che non venga esplicitamente ignorato, rileverà il supporto del colore, con isatty:

color_option = isatty (STDOUT_FILENO) && should_colorize ();

1
Il mio ultimo voto (ha raggiunto il limite) per oggi per supportarti per 100k. Ma io e Rinzwind vogliamo una torta quando succede.
hytromo,

Ho scaricato un programma con il nome era ack-grep. quando digita ack-grep foo, cercherà foo in tutte le sub directory. Quindi ho fatto ack-grep foo | meno e i colori sono spariti. Ma sembra che questo programma non supporti "--color = always", comunque grazie per l'aiuto
Mohammad Reza Rezwani,

1
@alex ack ha un --colorargomento:ack-grep -i select --color | less -R
Oli

@Oli ......... Oh mio Dio ........ l'unica cosa che posso dire sulla tua conoscenza, aiuto e potere di Linux
Mohammad Reza Rezwani,

1
@ B1KMusic Sono d'accordo. Sono d'accordo, tanto che ho trovato il modo di come funziona e aggiornato la risposta. Puoi forzare le colonne con un -Cargomento.
Oli

2

Se ti interessano i colori lesspiù in generale, ti consigliamo di dare un'occhiata lesspipe.sh. Vedi, ad esempio, http://freecode.com/projects/lesspipe .

lesspipe.sh è un filtro di input per il cercapersone less, come descritto nella pagina man di less. Lo script viene eseguito in una shell compatibile con ksh (ad esempio bash, zsh) e consente di utilizzare meno per visualizzare file con contenuto binario, file compressi, archivi e file contenuti negli archivi.

Colorerà anche script di shell, script perl, ecc. In modo simile a un editor di testo, ma senza l'uso di alcun programma di "preelaborazione" per eseguire la colorazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.