Quero saber se há alguma maneira de verificar se meu programa pode gerar saída de terminal usando cores ou não.
Executando comandos como less
e olhando para a saída de um programa que sai usando cores, a saída é exibida incorretamente, como
[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]
obrigado
Respostas:
Em que idioma você está escrevendo seu aplicativo?
A abordagem normal é verificar se o dispositivo de saída é um tty e, se for, verificar se esse tipo de terminal suporta cores.
Em
bash
, isso pareceriaEm C, você precisa digitar muito mais, mas pode obter o mesmo resultado usando o isatty e as funções listadas em
man 3 terminfo
.fonte
Isso deve ser suficiente:
tput colors explicou:
Se você olhar a página de manual, perceberá o seguinte:
E...
O termcap
colors
está no banco de dados terminfo, para que você possa solicitá-lo. Se você tiver um status de saída zero, o termcap será compilado. Mas se você tiver algo como:Isso mostra que unknowntermcap não existe. Então, é isso:
Mostra que seu comando estava certo.
Outras maneiras úteis:
Felicidades
fonte
colors
não está documentado natput
página de manual (!), portanto, devo procurar um número> = 8 no stdout ou um código de retorno 0?colors
capacidade está documentada no terminfo (5) . Testando usandotput -T dumb colors
,tput -T vt220 colors
,tput -T linux colors
,tput -T xterm colors
sugere valores comuns são-1
(sem suporte de cor) e8
(8 cores). Observe que isso só se aplica após a verificação do dispositivo de saída como um terminal (por exemplo,[ -t 1 ]
ouisatty
).tput colors
retorna o que o banco de dados do terminal local pensa do terminal. Isso pode ou não corresponder ao que o terminal pode realmente fazer, especialmente para um tipo de terminal como oxterm
que existe em várias variantes (variando de preto e branco a 256 cores).Para este caso de uso, o que os programas costumam fazer (por exemplo, GNU ls ou GNU grep
--color=auto
) é usar cores se a saída for para um terminal e sem cores caso contrário. Os terminais que não suportam sequências de alteração de cores ANSI são raros o suficiente para que seus usuários substituam a opção padrão. De qualquer forma, verifique se o aplicativo tem uma opção para forçar ou desabilitar as cores.Em um script de shell, use
[ -t 1 ]
para testar se a saída padrão é um terminal.Em um programa usando a API C, chame
isatty(1)
.fonte
Tente usar
less --RAW-CONTROL-CHARS
.Neste exemplo, estou usando o logtool , que imprime a saída usando cores.
Sem --RAW-CONTROL-CHARS:
Com --RAW-CONTROL-CHAR (imagine que isso tenha cores bonitas. Além disso, não sei por que isso
^G
está sendo exibido.):fonte
Isso seria culpa de
less
não estar definido para interpretar escapes de ANSI; procureR
dentro$LESSOPTS
. Quanto a determinar se o sistema sabe que seu terminal pode lidar com cores,tput colors
produzirá o número de cores que ele suporta ou-1
se não suporta cores. (Observe que alguns terminais podem ser usados emxterm
vez dexterm-color
como descrição do terminal, mas ainda suportam cores.)fonte
Se você deseja adicionar cores à saída, mas apenas quando as cores são suportadas, basta usar
tput
. http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.htmlfonte