
El comando tput
tiene dos opciones diferentes para configurar el color setf
y setaf
, sin embargo, ambas parecen funcionar bien en mi computadora:
$ tput setf 2 && echo 'Hello world!'
$ tput setaf 2 && echo 'Hello world!'
Parece haber una dualidad similar con setb
y setab
.
¿Cuál es la diferencia entre las dos opciones?
Respuesta1
setf
está limitado a sólo 8 colores. setaf
Puede configurar hasta 256 colores.
(toda la siguiente información será específica de urxvt, ya que ese es mi terminal, pero la información será similar, si no la misma, a la de otros terminales)
Ambos setf
y setaf
proporcionan un código de escape diferente. Puedes ver esto en lo siguiente:
# tput setf 2 | xxd
0000000: 1b5b 3332 6d .[32m
# tput setaf 2 | xxd
0000000: 1b5b 3338 3b35 3b32 6d .[38;5;2m
Desde mi 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)
Por lo tanto, en el resultado anterior xxd
, podemos ver que tput setf 2
usa Pm = 32
, que establecerá el color en verde. tput setaf 2
por otro lado utiliza el Pm = 38;5
, que representa el código de color definido en ISO 8613-6 (también verde).
En ISO 8613-6, los colores 0x00-0x07 son los mismos que los colores estándar y 0x08 - 0x0f son los colores estándar en "negrita". Una vez que llegas a 0x10-0xff, obtienes nuevos colores.
Robado deWikipedia:
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
Respuesta2
Del manual:man 5 terminfo
Para cambiar el color actual de primer plano o de fondo en un terminal tipo Tektronix, utilicesetaf(establecer ANSI en primer plano) yestablecer(establecer fondo ANSI) oconjunto(poner en primer plano) ysetb(Definir fondo). Estos toman un parámetro, el número de color. La documentación de SVr4 describe sólosetaf/establecer; el borrador XPG4 dice que "Si el terminal admite secuencias de escape ANSI para establecer el fondo y el primer plano, deben codificarse comosetafyestablecer, respectivamente. Si el terminal admite otras secuencias de escape para establecer el fondo y el primer plano, deben codificarse comoconjuntoysetb, respectivamente. La función vidputs() y las funciones de actualización utilizansetafyestablecersi están definidos."
Entonces la respuesta es:setafmedioEstablecer primer plano ANSI, es decir, utilizar secuencias de escape ANSI, yconjuntomedioEstablecer primer plano(usando algunas secuencias de escape distintas de ANSI).
Respuesta3
Los dos conjuntos de capacidades utilizan un orden diferente para rojo/azul en la lista de colores ANSI.
Como se señaló, se explica en las ncurses.página de manual de información termal. Algo de historia:
- Al principio (mediados de la década de 1990), la mayoría disponible"color"descripciones de terminales utilizadas
setf/setb
. - Hubo cierta confusión con los usuarios de termcap que usaron los
Sf/Sb
códigos correspondientes en lugar desetaf/setab
(yAF/AB
para termcap), pero usaron las secuencias de escape ANSI (que funcionan con termcap) en lugar de usar elcorrectocapacidades con las capacidades ANSI. - Debido a eso, encontrará entradas terminales con los dos equiparados, por ejemplo,término mg,interix,mejor(así como varias entradas en el archivo termcap de FreeBSD, nuevamente debido a esta confusión inicial combinada con la renuencia de otros a modificar sus programas).
Los ANSI setaf/setab
se agregaron bastante tarde en la historia de terminfo, como se puede inferir de su posición en ellista de cadenas de capacidad. Tenga en cuenta que se agregaron por etapas a lo largo de algunos años y que algunos sistemas diferían (ncurss tiene algunos ejemplos comoCaps.hpux
para permitir que se compile para que coincida con esos sistemas). A ello se debía el pequeño número de descripciones de terminales útiles que podían utilizarse como referencia.
Con todo eso, el hecho de que las setf/setb
cadenas existentes no coincidieran con el orden ANSI no se notó de inmediato, lo que llevó a algunoscorrecciones en 1998y las preguntas frecuentes¿Por qué se intercambian rojo y azul?.
Si bien era posible ampliar la secuencia ANSI de 8 colores a 16 colores (suponiendo que los colores 8-15 fueran versiones más brillantes de 0-7), no había ninguna buena razón para inventar un esquema que se extendiera setf/setb
más allá de los primeros 16 colores.