Existem dois problemas aqui:
- Comandos como
ls
- que detectam automaticamente o suporte de cores - não encontram suporte de pipes -
less
está definido para exibir apenas os códigos de cores por padrão.
Ambos podem ser superados, mas é um pouco desajeitado:
ls --color=always | less -R
Isso não é ls
específico. Muitos comandos que suportam cores também possuem um argumento de substituição.
Uma resposta um pouco mais profunda é que ls
está verificando se seu STDOUT pertence ou não a um terminal real. Quando você canaliza as coisas, o STDOUT é definido para o STDIN do próximo comando.
Você pode ver isso no trabalho no código-fonte ls
. Ele está usando o comando isatty
(uma interface POSIX principal) para descobrir qual é a situação:
-
As cores estão ativadas por padrão:
print_with_color = (i == color_always || (i == color_if_tty && isatty (STDOUT_FILENO)));
-
Nós tentamos produzir em várias colunas:
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
faz uma coisa muito semelhante, a menos que seja explicitamente substituído, ele detectará o suporte a cores, com isatty
:
color_option = isatty (STDOUT_FILENO) && should_colorize ();