
O comando tput
tem duas opções diferentes para definir a cor setf
e setaf
, ainda assim, ambos parecem funcionar bem no meu computador:
$ tput setf 2 && echo 'Hello world!'
$ tput setaf 2 && echo 'Hello world!'
Parece haver uma dualidade semelhante com setb
e setab
.
Qual é a diferença entre as duas opções?
Responder1
setf
é limitado a apenas 8 cores. setaf
pode configurar até 256 cores.
(todas as informações a seguir serão específicas do urxvt, pois esse é o meu terminal, mas as informações serão semelhantes, se não iguais, a outros terminais)
Ambos setf
e setaf
fornecem um código de escape diferente. Você pode ver isso a seguir:
# tput setf 2 | xxd
0000000: 1b5b 3332 6d .[32m
# tput setaf 2 | xxd
0000000: 1b5b 3338 3b35 3b32 6d .[38;5;2m
Da minha urxvt(7)
página de manual:
"ESC [ Pm m"
Character Attributes (SGR)
...
Pm = 30 / 40 fg/bg Black
Pm = 31 / 41 fg/bg Red
Pm = 32 / 42 fg/bg Green
Pm = 33 / 43 fg/bg Yellow
Pm = 34 / 44 fg/bg Blue
Pm = 35 / 45 fg/bg Magenta
Pm = 36 / 46 fg/bg Cyan
Pm = 37 / 47 fg/bg White
Pm = 38;5 / 48;5 set fg/bg to colour #m (ISO 8613-6)
Assim, a partir da xxd
saída acima, podemos ver que tput setf 2
usa o Pm = 32
, que definirá a cor como verde. tput setaf 2
por outro lado utiliza o Pm = 38;5
, que representa o código de cores definido na ISO 8613-6 (também verde).
Na ISO 8613-6, as cores 0x00-0x07 são iguais às cores padrão e 0x08 - 0x0f são as cores "negritos" padrão. Quando chegar a 0x10-0xff, você obterá novas cores.
Roubado deWikipédia:
0x00-0x07: standard colors (as in ESC [ 30..37 m)
0x08-0x0f: high intensity colors (as in ESC [ 90..97 m)
0x10-0xe7: 6*6*6=216 colors: 16 + 36*r + 6*g + b (0≤r,g,b≤5)
0xe8-0xff: grayscale from black to white in 24 steps
Responder2
Do manual:man 5 terminfo
Para alterar a cor atual de primeiro plano ou de fundo em um terminal do tipo Tektronix, useconjunto(definir primeiro plano ANSI) econjunto(definir plano de fundo ANSI) ouconjunto(definir primeiro plano) econjunto(definir plano de fundo). Eles levam um parâmetro, o número da cor. A documentação do SVr4 descreve apenasconjunto/conjunto; o rascunho do XPG4 diz que "Se o terminal suportar sequências de escape ANSI para definir plano de fundo e primeiro plano, elas deverão ser codificadas comoconjuntoeconjunto, respectivamente. Se o terminal suportar outras sequências de escape para definir plano de fundo e primeiro plano, elas deverão ser codificadas comoconjuntoeconjunto, respectivamente. A função vidputs() e as funções de atualização usamconjuntoeconjuntose estiverem definidos."
Então a resposta é:conjuntosignificaDefinir primeiro plano ANSI, ou seja, use sequências de escape ANSI econjuntosignificaDefinir primeiro plano(usando algumas sequências de escape diferentes de ANSI).
Responder3
Os dois conjuntos de recursos usam ordenações diferentes para vermelho/azul na lista de cores ANSI.
Conforme observado, é explicado nas ncursespágina de manual terminfo. Um pouco de história:
- No início (meados da década de 1990), mais disponível"cor"descrições dos terminais usadas
setf/setb
. - Houve alguma confusão com os usuários do termcap que usaram os
Sf/Sb
códigos correspondentes em vez desetaf/setab
(eAF/AB
para termcap) - mas usando as sequências de escape ANSI (que funcionam com termcap) em vez de usar ocorretocapacidades com as capacidades ANSI. - Por causa disso, você encontrará entradas de terminal com os dois equiparados, por exemplo,mgtermo,interix,beterm(bem como várias entradas no arquivo termcap do FreeBSD, novamente devido a esta confusão inicial combinada com a relutância de outros em alterar seus programas).
O ANSI setaf/setab
foi adicionado bem tarde na história do terminfo, como você pode deduzir de sua posição nolista de strings de capacidade. Lembre-se de que eles foram adicionados em etapas ao longo de alguns anos e alguns sistemas eram diferentes (o ncurses tem alguns exemplos, comoCaps.hpux
para permitir que seja compilado para corresponder a esses sistemas). Isso explicava o pequeno número de descrições de terminais úteis que poderiam ser usadas como referência.
Com tudo isso, o fato de as setf/setb
strings existentes não corresponderem à ordem ANSI não foi imediatamente percebido, o que levou a algunscorreções em 1998e as perguntas frequentesPor que vermelho/azul são trocados?.
Embora fosse possível estender a sequência ANSI de 8 cores para 16 cores (supondo que as cores 8 a 15 eram versões mais brilhantes de 0 a 7), não havia nenhuma boa razão para inventar um esquema que se estendesse setf/setb
além das primeiras 16 cores.