Comment créer des couleurs de sortie moins

19

Lorsque je lance un programme (par exemple grep ou ls ) sans pager, sa sortie est colorée. Cependant, quand je l'exécute, sa sortie est diffusée dans less , aucune couleur n'est affichée.

Par exemple, cette commande affiche une sortie colorée:

grep -r something

mais cela ne veut pas:

grep -r something | less

Pourquoi? Comment voir les couleurs via less ?

    
posée Mohammad Reza Rezwani 13.06.2014 - 15:57
la source

2 réponses

31

Il y a deux problèmes ici:

  • Les commandes telles que ls - qui détectent automatiquement la prise en charge des couleurs - ne sont pas prises en charge par les pipes
  • 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

Ceci n'est pas spécifique à ls . De nombreuses commandes prenant en charge la couleur ont également un argument de substitution.

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

Vous pouvez voir ceci au travail dans le code source ls . Il utilise la commande isatty (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 générer 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, sauf en cas de substitution explicite, il détectera la prise en charge des couleurs, avec isatty :

color_option = isatty (STDOUT_FILENO) && should_colorize ();
    
réponse donnée Oli 13.06.2014 - 16:49
la source
2

Si vous êtes intéressé par les couleurs de less plus généralement, vous pouvez regarder lesspipe.sh . Voir, par exemple, lien .

  

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

Il colorisera également les scripts shell, les scripts perl, etc., de la même manière qu’un éditeur de texte, mais sans utiliser de programme de "prétraitement" pour effectuer la colorisation.

    
réponse donnée DaveEmme 13.06.2014 - 21:11
la source

Lire d'autres questions sur les étiquettes