Il y a deux problèmes ici :
- Des commandes comme
ls
-qui détectent automatiquement le support de la couleur, ne trouvent pas de support dans les tuyaux.
-
less
est configuré pour afficher uniquement les codes de couleur par défaut.
Les deux peuvent être surmontés mais c'est un peu lourd :
ls --color=always | less -R
Ce n'est pas ls
spécifique. De nombreuses commandes qui prennent 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 à un vrai terminal ou non. Lorsque vous faites du pipeing, le STDOUT est défini comme le STDIN de la commande suivante.
Vous pouvez voir cela au travail dans le ls
code source . Il utilise le isatty
(une interface POSIX de base) pour savoir ce qu'il en est :
-
Les couleurs sont activées par défaut :
print_with_color = (i == color_always
|| (i == color_if_tty
&& isatty (STDOUT_FILENO)));
-
Est-ce que nous essayons de sortir 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 surchargé, il détectera le support des couleurs, avec la fonction isatty
:
color_option = isatty (STDOUT_FILENO) && should_colorize ();