¿Cuál es la diferencia entre 'setf' y 'setaf' de tput?

¿Cuál es la diferencia entre 'setf' y 'setaf' de tput?

El comando tputtiene dos opciones diferentes para configurar el color setfy 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 setby setab.

¿Cuál es la diferencia entre las dos opciones?

Respuesta1

setfestá limitado a sólo 8 colores. setafPuede 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 setfy setafproporcionan 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 2usa Pm = 32, que establecerá el color en verde. tput setaf 2por 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/Sbcódigos correspondientes en lugar de setaf/setab(y AF/ABpara 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/setabse 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.hpuxpara 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/setbcadenas 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/setbmás allá de los primeros 16 colores.

información relacionada