Después de de una prolongada recopilación de datos solucionamos este inconveniente que presentan ciertos los lectores. Te regalamos la respuesta y nuestro deseo es serte de mucha apoyo.
Solución:
El recuento de colores disponibles para tput viene dado por tput colors
.
Para ver los 8 colores básicos (como los usa setf
en la terminal urxvt y setaf
en xterm terminal):
$ printf ' e[%sm▒' 30..37 0; echo ### foreground
$ printf 'e[%sm ' 40..47 0; echo ### background
And usually named as this:
Color #define Value RGB
black COLOR_BLACK 0 0, 0, 0
red COLOR_RED 1 max,0,0
green COLOR_GREEN 2 0,max,0
yellow COLOR_YELLOW 3 max,max,0
blue COLOR_BLUE 4 0,0,max
magenta COLOR_MAGENTA 5 max,0,max
cyan COLOR_CYAN 6 0,max,max
white COLOR_WHITE 7 max,max,max
To see the extended 256 colors (as used by setaf
in urxvt):
$ printf 'e[48;5;%dm ' 0..255; printf 'e[0m n'
If you want numbers and an ordered output:
#!/bin/bash
color()
for c; do
printf 'e[48;5;%dm%03d' $c $c
done
printf 'e[0m n'
IFS=$' tn'
color 0..15
for ((i=0;i<6;i++)); do
color $(seq $((i*36+16)) $((i*36+51)))
done
color 232..255
The 16 million colors need quite a bit of code (some consoles can not show this).
The basics is:
fb=3;r=255;g=1;b=1;printf 'e[0;%s8;2;%s;%s;%sm▒▒▒ ' "$fb" "$r" "$g" "$b"
fb
is front/back
or 3/4
.
A simple test of your console capacity to present so many colors is:
for r in 200..255..5; do fb=4;g=1;b=1;printf 'e[0;%s8;2;%s;%s;%sm ' "$fb" "$r" "$g" "$b"; done; echo
It will present a red line with a very small change in tone from left to right. If that small change is visible, your console is capable of 16 million colors.
Each r
, g
, and b
is a value from 0 to 255 for RGB (Red,Green,Blue).
If your console type support this, this code will create a color table:
mode2header()
#### For 16 Million colors use e[0;38;2;R;G;Bm each RGB is 0..255
printf 'e[mRn' # reset the colors.
printf 'ne[m%59sn' "Some samples of colors for r;g;b. Each one may be 000..255"
printf 'e[m%59sn' "for the ansi option: e[0;38;2;r;g;bm or e[0;48;2;r;g;bm :"
mode2colors()
# foreground or background (only 3 or 4 are accepted)
local fb="$1"
[[ $fb != 3 ]]&& fb = 4 muestras locales = (0 63 127 191 255) para r en "$ muestras[@] "; hacer para g en" $ muestras[@] "; hazlo para b en" $ muestras[@] "; hacer printf ' e[0;%s8;2;%s;%s;%sm%03d;%03d;%03d ' "$fb" "$r" "$g" "$b" "$r" "$g" "$b"
done; printf 'e[mn'
done; printf 'e[m'
done; printf 'e[mResetn'
mode2header
mode2colors 3
mode2colors 4
To convert an hex color value to a (nearest) 0-255 color index:
fromhex()
hex=$1#"#"
r=$(printf '0x%0.2s' "$hex")
g=$(printf '0x%0.2s' $hex#??)
b=$(printf '0x%0.2s' $hex#????)
printf '%03d' "$(( (r<75?0:(r-35)/40)*6*6 +
(g<75?0:(g-35)/40)*6 +
(b<75?0:(b-35)/40) + 16 ))"
Use it as:
$ fromhex 00fc7b
048
$ fromhex #00fc7b
048
To find the color number as used in HTML colors format:
#!/bin/dash
tohex()
dec=$(($1%256)) ### input must be a number in range 0-255.
if [ "$dec" -lt "16" ]; entonces bas = $ ((dec% 16)) mul = 128
[ "$bas" -eq "7" ] && mul = 192
[ "$bas" -eq "8" ] && bas = 7
[ "$bas" -gt "8" ] && mul = 255 a = "$ (((bas & 1) * mul))" b = "$ ((((bas & 2) >> 1) * mul))" c = "$ ((((bas & 4) >> 2 ) * mul)) "printf 'dec =% 3s basic = #% 02x% 02x% 02x n'" $ dec "" $ a "" $ b "" $ c "elif [ "$dec" -gt 15 ] && [ "$dec" -lt 232 ]; entonces b = $ (((dic-16)% 6)); b = $ ((b == 0? 0: b * 40 + 55)) g = $ (((dic-16) / 6% 6)); g = $ ((g == 0? 0: g * 40 + 55)) r = $ (((16-dic) / 36)); r = $ ((r == 0? 0: r * 40 + 55)) printf 'dec =% 3s color = #% 02x% 02x% 02x n' "$ dec" "$ r" "$ g" " $ b "más gris = $ (((dec-232) * 10 + 8)) printf 'dec =% 3s gris = #% 02x% 02x% 02x n'" $ dec "" $ gris "" $ gris " "$ gris" fi para i en $ (seq 0 255); hacer tohex $ i hecho
Úselo como ("básico" son los primeros 16 colores, "color" es el grupo principal, "gris" son los últimos colores grises):
$ tohex 125 ### A number in range 0-255
dec= 125 color= #af005f
$ tohex 6
dec= 6 basic= #008080
$ tohex 235
dec= 235 gray= #262626
los tput
La utilidad está utilizando una tabla de búsqueda de 256 colores para imprimir secuencias de escape ANSI de 8 bits (comenzando con Esc y [
) que hace uso de las capacidades del terminal, por lo que estas secuencias de control se pueden interpretar como colores. Se trata de un conjunto predefinido de 256 colores que se utilizan comúnmente en las tarjetas gráficas.
Para imprimir los 256 colores en el terminal, pruebe el siguiente de una sola línea:
for c in 0..255; do tput setaf $c; tput setaf $c | cat -v; echo =$c; done
Sugerencia: anexar | column
para columnate lista.
Esta tabla de búsqueda de 256 colores también se puede encontrar en la página de Wikipedia de la siguiente manera:
La respuesta corta es que puede encontrar tablas de colores en la web y hacerlas coincidir con el número de color.
La respuesta larga es que el mapeo correcto depende del terminal:
los 125
es un parámetro de una secuencia de escape denominada setaf
en la descripción del terminal. tput
no concede un significado particular al número. Eso realmente depende del emulador de terminal en particular.
Hace un tiempo, ANSI definió códigos para 8 colores, y había dos esquemas para numerarlos. Los dos se ven en algunas descripciones de terminales como los pares setf/setb
o setaf/setab
. Dado que este último tiene la connotación de "colores ANSI", verá que se usa con más frecuencia. El primero (setf / setb) cambió el orden de rojo / azul como se indica en las preguntas frecuentes de ncurses ¿Por qué se intercambian rojo / azul?, pero en cualquier caso, el esquema se estableció solo para numerar los colores. No existe una relación predefinida entre esos números y el contenido RGB.
Para emuladores de terminal específicos, hay paletas de colores predefinidas que se pueden enumerar con bastante facilidad y se pueden programar utilizando estas secuencias de escape. Existen no estándares relevantes, y verá diferencias entre los emuladores de terminal, como se indica en las preguntas frecuentes de xterm No me gusta ese tono de azul.
Sin embargo, la convención a menudo se confunde con los estándares. En el desarrollo de xterm durante los últimos 20 años, incorporó colores ANSI (8), adaptó el aixterm
cuentan con (16) colores, extensiones agregadas para 88 y 256 colores. Mucho de eso ha sido adoptado por otros desarrolladores para diferentes emuladores de terminal. Eso se resume en las preguntas frecuentes de xterm ¿Por qué no equiparar "xterm" con "xterm-256color"?.
El código fuente de xterm incluye scripts para demostrar los colores, por ejemplo, usando las mismas secuencias de escape que tput
usaría.
También puede encontrar útil esta pregunta / respuesta: Valores RGB de los colores en el índice de colores extendido Ansi (17-255)
Si entiendes que te ha resultado de utilidad este artículo, agradeceríamos que lo compartas con otros entusiastas de la programación así contrubuyes a difundir esta información.