Come faccio a rendere "meno" i colori di output?

20

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

Ad esempio, questo comando emette un output colorato:

grep -r something

ma questo non lo è:

grep -r something | less

Perché? Come posso vedere i colori attraverso less ?

    
posta Mohammad Reza Rezwani 13.06.2014 - 15:57

2 risposte

31

Qui ci sono due problemi:

  • Comandi come ls -che rilevano automaticamente il supporto del colore- non trovare il supporto dalle pipe
  • 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 è ls specifico. Molti comandi che supportano il colore hanno anche un argomento override.

Una risposta leggermente più approfondita è che ls sta verificando se il suo STDOUT appartiene o meno a un vero terminale. Quando si canalizzano le cose, lo STDOUT è impostato su STDIN del comando successivo.

Puoi vedere questo al lavoro nel codice sorgente ls . Sta usando il comando isatty (un'interfaccia POSIX di base) per capire quale sia 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;
      }
    

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

color_option = isatty (STDOUT_FILENO) && should_colorize ();
    
risposta data Oli 13.06.2014 - 16:49
2

Se ti interessano i colori in less in generale, potresti voler guardare lesspipe.sh . Vedi, ad esempio, link .

  

lesspipe.sh è un filtro di input per il cercapersone meno come descritto nella pagina man di less. Lo script gira sotto una shell compatibile con ksh (ad es. Bash, zsh) e consente di usare meno per visualizzare i file con contenuto binario, file compressi, archivi e file contenuti negli archivi.

Colorerà anche gli script di shell, gli script perl, ecc. in modo simile a un editor di testo, ma senza l'uso di alcun programma di "pre-elaborazione" per colorare.

    
risposta data DaveEmme 13.06.2014 - 21:11

Leggi altre domande sui tag