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 ();