Comment créer des couleurs de sortie «moins»?


25

Lorsque je lance un programme (par exemple grepou ls) sans pageur, sa sortie est colorée. Cependant, lorsque je l'exécute en canalisant sa sortie less, aucune couleur n'est affichée.

Par exemple, cette commande génère une sortie colorée:

grep -r something

mais cela ne veut pas:

grep -r something | less

Pourquoi? Comment voir les couleurs à travers less?


5
grep --color=always "search string" * | less -Rmais j'ai tendance à utiliser de mostnos jours au lieu de less. AUSSI: gnu.org/software/src-highlite est un surligneur de couleur (moins fonctionne aussi)
Rinzwind

@alex avez-vous installé python-pygments?
souravc

@souravc non je n'ai pas installé ça
Mohammad Reza Rezwani

@ales m'ignore sommes-nous? >: - D
Rinzwind

Réponses:


36

Ici, nous avons deux problèmes:

  • Les commandes telles que ls—quelles détectent automatiquement la prise en charge des couleurs — ne trouvent pas la prise en charge des tuyaux
  • less est défini pour afficher uniquement les codes de couleur par défaut.

Les deux peuvent être surmontés mais c'est un peu maladroit:

ls --color=always | less -R

Ce n'est pas lsspécifique. De nombreuses commandes qui prennent en charge la couleur ont également un argument de remplacement.


Une réponse un peu plus approfondie lsconsiste à vérifier si son STDOUT appartient ou non à un vrai terminal. Lorsque vous redirigez des éléments, le STDOUT est défini sur le STDIN de la commande suivante.

Vous pouvez le voir à l'œuvre dans le lscode source . Il utilise la isattycommande (une interface POSIX de base) pour déterminer la situation:

  • Les couleurs sont-elles activées par défaut:

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));
    
  • Essayons-nous de produire dans plusieurs colonnes:

    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;
      }
    

grepfait une chose très similaire, sauf si elle est explicitement remplacée, elle détectera la prise en charge des couleurs, avec isatty:

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

1
Mon dernier vote positif (atteint la limite) pour aujourd'hui pour vous soutenir pendant 100k. Mais Rinzwind et moi voulons du gâteau quand ça arrive.
hytromo

J'ai téléchargé un programme dont le nom était ack-grep. en tapant ack-grep foo, il recherchera foo dans tous les sous-répertoires. J'ai donc fait ack-grep foo | moins, et les couleurs ont disparu. Mais il semble que ce programme ne supporte pas "--color = always", merci pour votre aide
Mohammad Reza Rezwani

1
@alex ack a un --colorargument:ack-grep -i select --color | less -R
Oli

@Oli ......... Oh mon Dieu ........ la seule chose que je peux dire sur vos connaissances et votre aide et aussi la puissance de linux
Mohammad Reza Rezwani

1
@ B1KMusic Je suis d'accord. Je suis tellement d'accord que j'ai trouvé comment cela fonctionne et j'ai mis à jour la réponse. Vous pouvez forcer les colonnes avec un -Cargument.
Oli

2

Si vous êtes intéressé par les couleurs en lessgénéral, vous voudrez peut-être regarder lesspipe.sh. Voir, par exemple, http://freecode.com/projects/lesspipe .

lesspipe.sh est un filtre d'entrée pour le pager less comme décrit dans la page de manuel de less. Le script s'exécute sous un shell compatible ksh (par exemple bash, zsh) et vous permet d'utiliser moins pour afficher des fichiers avec du contenu binaire, des fichiers compressés, des archives et des fichiers contenus dans des archives.

Il coloriera également les scripts shell, les scripts perl, etc. de manière similaire à un éditeur de texte, mais sans utiliser de programme de "prétraitement" pour effectuer la colorisation.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.