web-dev-qa-db-fra.com

Comment créer des couleurs de sortie `less`?

Lorsque j'exécute un programme (par exemple, grep ou ls) sans pageur, sa sortie est colorée. Cependant, lorsque je l'exécute en transférant sa sortie à less, aucune couleur n'est affichée.

Par exemple, cette commande génère une sortie en couleur:

grep -r something

mais cela ne veut pas:

grep -r something | less

Pourquoi? Comment puis-je voir les couleurs avec less?

24

Ici, nous avons deux problèmes:

  • Des commandes telles que ls (qui détecte automatiquement le support des couleurs) ne trouvent pas de support dans les tubes
  • less est configuré 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 ls spécifique. De nombreuses commandes prenant en charge la couleur ont également un argument de remplacement.


Une réponse un peu plus approfondie est que ls vérifie si son STDOUT appartient ou non à un terminal réel. Lorsque vous transférez des éléments, le STDOUT est défini sur le STDIN de la commande suivante.

Vous pouvez le voir au travail dans le code source ls . Il utilise la commande isatty (une interface POSIX principale) pour comprendre 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 d’afficher en 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;
      }
    

grep fait une chose très similaire, à moins d'être explicitement remplacé, il détectera la prise en charge des couleurs avec isatty:

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

Si les couleurs de less vous intéressent plus généralement, consultez plutôt 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 de ressources pour afficher des fichiers avec un contenu binaire, des fichiers compressés, des archives et des fichiers contenus dans des archives.

Il colorera également les scripts Shell, les scripts Perl, etc. de la même manière qu'un éditeur de texte, mais sans utiliser aucun programme de "prétraitement" pour effectuer la colorisation.

2
DaveEmme