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 códigos de cores por padrão.
Ambos podem ser superados, mas é um pouco desajeitado:
ls --color=always | less -R
Isto não é ls
específico. Muitos comandos que suportam cores também têm um argumento de substituição.
Uma resposta um pouco mais profunda ls
é verificar se o STDOUT pertence ou não a um terminal real. Quando você canaliza as coisas, o STDOUT é definido como o STDIN do próximo comando.
Você pode ver isso funcionando no ls
código fonte . Está usando oisatty
comando (uma interface principal do POSIX) 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)));
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 de cores, com isatty
:
color_option = isatty (STDOUT_FILENO) && should_colorize ();
grep --color=always "search string" * | less -R
mas eu costumo usarmost
hoje em vez deless
. TAMBÉM: gnu.org/software/src-highlite é um marcador de cor (menos obras também)