Como posso verificar a existência de cor na minha caixa de linux?

1

Eu quero fazer algo assim na minha caixa de linux:

if [[ colors exist ]];then
echo "some text in colors"
fi

minha dúvida é:

Estou usando o sed para colocar cores no arquivo de log para algum texto, mas se a caixa do linux não tiver as cores ativadas, ele modificará o arquivo de log de uma maneira desnecessária, como colocar alguns caracteres desnecessários como [033m etc

    
por munish 25.03.2013 / 09:51

3 respostas

3

Talvez com tput, verifique a contagem de cores disponíveis,

ncolors=$(tput colors)

if [[ $ncolors -ge 8 ]];then
   # colors available
fi
    
por 25.03.2013 / 10:14
1

As cores tty são uma característica do terminal no qual o texto é mostrado. Quase todos os terminais hoje lidam com a sequência de escape ANSI, de modo que você pode deixar de colorir o texto quando gerado, mas deve realmente fazê-lo quando estiver escrito (talvez sob o controle do usuário no final da escrita). Por exemplo. configurar cores personalizadas para o seu texto para o seu pager).

    
por 25.03.2013 / 11:51
0

Um método possível de detectar se você está executando diretamente de um emulador de terminal ou se a saída está sendo gravada em um arquivo de log, é usar readlink :

if [[ $(readlink -f /dev/stdout) =~ '^/dev/pts/' ]]; then
   # colors available
fi

Isso normalmente deve funcionar no moderno linux com o udev e o procfs. Não tenho certeza se existe algo mais portátil. Isso usa o operador especial de expressão regular bash =~ , então ele só funcionará com o bash.

Uma alternativa é, como alguém já explicou, usar tty >/dev/null ; no seu caso, você pode estar interessado apenas na saída padrão e não na entrada padrão, então você vai querer fazer com que sua saída padrão seja a entrada padrão de tty :

if tty <&1 >/dev/null; then
   # colors available
fi

Isso desativaria as cores quando você executar ./myscript.sh >>log_file , mas ativá-las quando você executar ./myscript.sh .

Eu recomendaria usar [[ $(tput colors) -ge 8 ]] , para que, quando a variável de ambiente TERM estiver definida como dumb , as cores não sejam exibidas.

Se você escrever um arquivo de log com cores, você ainda poderá lê-lo; você terá que usar algo como less -r ou multitail -cT ansi de um emulador de terminal com suporte a cores.

    
por 25.03.2013 / 14:11