Quantas cores são suportadas e como alterar a cor de primeiro e segundo plano depende do terminal.
O banco de dados terminfo
geralmente está lá para ajudá-lo a encontrar a seqüência correta.
A maioria dos terminais de cores suporta as sequências de escape de cores ANSI para alterar as cores de fundo e de fundo 0 a 7 .
Isso é:
- definir cor de primeiro plano $ n :
printf "[3${n}m"
- definir a cor de fundo $ n :
printf "[4${n}m"
Alguns terminais (raros) (como emu
) usam sequências diferentes para essas cores ANSI.
Alguns terminais (raros) como o console QNX possuem diferentes seqüências de escape e cores diferentes.
Alguns trabalhos (raros) com pares de cores. Você define um par de cores para o fundo e o primeiro plano e, em seguida, tem uma seqüência de escape para selecionar o par que deseja usar.
Agora, xterm e os mais modernos emuladores de terminal de Software Livre estendem as 8 cores ANSI básicas, até 16 (onde 8 a 15 são versões mais brilhantes das cores ANSI 0 a 7), 88 ou 256 cores para alguns. p>
Alguns terminais como rxvt
suportam apenas 8 cores, mas usam cores mais brilhantes se negrito também estiver aceso (em primeiro plano) ou piscar (em segundo plano) . 3[34;1m
dará um azul mais claro que 3[34m
.
A maneira mais portátil de usar cores é usar o banco de dados terminfo.
Pode ser pelo comando tput
. tcsh
e zsh
também têm echoti
embutido para isso.
Desde que o banco de dados terminfo esteja correto e o valor de $TERM
reflita corretamente o terminal que você está usando:
tput colors
Fornecerá o número de cores compatíveis com seu terminal.
Hoje em dia, exceto pelas raras exceções mencionadas acima, você pode assumir que seu terminal suportará cores ANSI. Os recursos terminfo para as cores de plano de fundo e de primeiro plano do ANSI são setab
e setaf
. Se o terminal suporta mais de 8 cores, você ainda pode usar essa capacidade para consultá-las.
tput setaf 233
Se o terminal suportar 256 cores, deve-se emitir a sequência de escape correta para essa cor 233.
Para xterm
, setaf
outputs 3[30m..3[37m
para cores 0 a 7, 3[90m..3[97m
para cores 8 a 15 e 3[38;5;16m..3[38;5;255m
para cores 16 a 255.
3[38;5;0m..3[38;5;15m
também funcionará, mas terá 4 bytes a mais que seu equivalente mais portátil para as cores de 0 a 15.
Então, para testar todas as cores suportadas pelo terminal. Se ele suporta cores ansi:
i=0; n=$(tput colors); while [ "$i" -lt "$n" ]; do
tput setaf "$i"; printf %04d "$i"
i=$((i + 1))
done
Se ele suportar outras cores:
i=0; n=$(tput colors); while [ "$i" -lt "$n" ]; do
tput setf "$i"; printf %04d "$i"
i=$((i + 1))
done
Se funciona com pares de cores (como hpterm-color):
i=0; n=$(tput pairs); while [ "$i" -lt "$n" ]; do
tput scp "$i"; printf %04d "$i"
i=$((i + 1))
done
Agora, para redefinir uma cor ou um par de cores, isso também varia entre os terminais.
Há um recurso initc
terminfo para redefinir uma determinada cor para os terminais que podem fazê-lo. E initp
para redefinir um par.
Por exemplo, para redefinir a cor 1 como branco brilhante:
tput initc 1 1000 1000 1000
Com xterm
, que envia a sequência: 3]4;1;rgb:FF/FF/FF3\
.
Para redefinir o par de cores 1 para branco em preto nos terminais que trabalham com pares:
tput initp 1 1000 1000 1000 0 0 0