Muitos emuladores de terminal permitem redefinir cores com seqüências de escape, e até mesmo um recurso terminfo para isso: initc
. Com esses, e supondo que o banco de dados terminfo esteja correto, você pode fazer:
tput initc 1 1000 0 0
Para redefinir a cor 1 (normalmente red
) para 1000 ‰ vermelho, 0 ‰ verde, 0 ‰ azul ( #ff0000
).
Então:
tput initc 1 1000 0 0
tput setaf 1 # to set the foreground color to 1
echo '██ = #FF0000'
tput sgr0
faria o que você quer.
Para ver qual sequência de escape corresponde:
$ tput initc 1 1000 0 0 | cat -vt
^[]4;1;rgb:FF/00/00^[\
Então, no meu terminal ( xterm
), eu também posso fazer:
printf '\e]4;1;rgb:FF/00/00\e\\e[31m██ = #FF0000\e[m\n'
Observe que ela muda a cor de color1
. Então, se você mudar para azul, todo o texto que foi exibido com essa cor mudará automaticamente de cor.
Para redefinir as cores para seus valores iniciais (inicial no momento em que xterm
foi iniciado), com xterm
:
printf '\e]104\a'
Ou para redefinir uma única cor:
printf '\e]104;1\a'
Para consultar o valor atual de uma cor, há uma seqüência de controle que faz com que xterm
envie de volta o valor como entrada de terminal. Você pode usar o comando xtermcontrol
para facilitar:
$ xtermcontrol --get-color1
rgb:ffff/ffff/0000
Mas isso só funciona para as primeiras 16 cores ( xterm
atualmente suporta 256).
Em terminais que não suportam redefinir as cores para seus padrões, mas suportam 256 cores à la xterm
, você pode querer usar as cores 17 e acima, já que elas raramente são usadas pelos aplicativos.
No entanto, note que algum banco de dados terminfo especifica incorretamente como atribuir e usar essas cores para esses terminais, assim você pode querer codificar as seqüências de escape da força $TERM
para algo como xterm-256color
.
printf '\e]4;17;rgb:ff/ff/00\a\e[38;5;17mThis is yellow\e[m\n'
printf '\e]4;18;rgb:ff/00/ff\a\e[38;5;18mThis is magenta\e[m\n'