
Quando executo um programa (por exemplo grep
ou ls
) sem pager, sua saída é colorida. No entanto, quando eu executo a saída less
, nenhuma cor é mostrada.
Por exemplo, este comando gera uma saída colorida:
grep -r something
mas isso não acontece:
grep -r something | less
Por que? Como posso ver as cores less
?
Responder1
Existem dois problemas aqui:
- Comandos como
ls
—que detectam automaticamente o suporte de cores— não encontram suporte em pipes less
está configurado para exibir apenas 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 aprofundada é ls
verificar se seu 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 no trabalhono ls
código fonte. Ele está usando o isatty
comando (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)));
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 algo muito semelhante, a menos que seja explicitamente substituído, detectará suporte a cores, com isatty
:
color_option = isatty (STDOUT_FILENO) && should_colorize ();
Responder2
Se você estiver interessado em cores de less
maneira mais geral, você pode querer dar uma olhada em lesspipe.sh
. Veja, por exemplo,https://github.com/wofr06/lesspipe.
lesspipe.sh é um filtro de entrada para o pager less conforme descrito na página man de less. O script é executado em um shell compatível com ksh (por exemplo, bash, zsh) e permite usar less para visualizar arquivos com conteúdo binário, arquivos compactados, arquivos e arquivos contidos em arquivos.
Ele também irá colorir scripts shell, scripts perl, etc. de forma semelhante a um editor de texto, mas sem o uso de qualquer programa de "pré-processamento" para fazer a coloração.
Responder3
A resposta de @oli depende de você ser capaz de fornecer sinalizadores apropriados ao comando que produz as cores. Isso pode ser difícil se os comandos estiverem enterrados em scripts e similares, e requer descobrir como fornecer sinalizadores apropriados separadamente para vários comandos que sabem como produzir escapes ANSI quando o ambiente do terminal diz que podem.
A resposta de @DaveEmme diz que você pode usar lesspipe para colorir a saída de qualquer fonte, mas até onde eu sei, ele não reterá a cor dos comandos que já a produzem quando a saída for para o terminal.
Se você já possui um comando que funciona bem em seu terminal, é bom poder executar esse comando de forma que os escapes de cores sejam mantidos independentemente da saída que está sendo canalizada, para que você possa alimentá-lo no less -R
.
unbuffer
faz isso por você. No debian, pelo menos, você consegue isso com sudo apt install expect-dev
.
Você pode então fazer:
unbuffer [command] |& less -R
Usar |&
em vez de |
pode ser um detalhe desnecessário, mas significa que STDERR é canalizado para menos, assim como STDOUT.
Graças ahttps://superuser.com/a/1260695/229226por esta.