El correo electrónico de Thomas Dickey (mantenedor de xterm) tiene esto. Tenga en cuenta en particular la parte sobre ?
. Se Ps = 4
refiere a OSC Ps ; Pt ST
dónde está OSC
(el prefijo "Control del sistema operativo") ESC ]
y ST
(el sufijo "Terminador de cadena") es \
(barra diagonal inversa). El 4
es uno de los posibles subcomandos para OSC.
Para toda la paleta, eso se puede configurar / recuperar utilizando la extensión de color 88/256. En ctlseqs.txt, se resume aquí:
Ps = 4 ; c ; spec -> Change Color Number c to the color
specified by spec. This can be a name or RGB specification as
per XParseColor. Any number of c/spec pairs may be given.
The color numbers correspond to the ANSI colors 0-7, their
bright versions 8-15, and if supported, the remainder of the
88-color or 256-color table.
If a "?" is given rather than a name or RGB specification,
xterm replies with a control sequence of the same form which
can be used to set the corresponding color. Because more than
one pair of color number and specification can be given in one
control sequence, xterm can make more than one reply.
Un poco más tarde en los documentos son más subcomandos OSC, Ps = 10
y Ps = 11
, entre otros.
Ps = 1 0 -> Change VT100 text foreground color to Pt.
Ps = 1 1 -> Change VT100 text background color to Pt.
Ejemplo: esto consulta el fondo usando Ps = "11"
(desde arriba) y Pt = "?"
, conectado al OSC Ps ; Pt ST
. En el eco, \033
se está utilizando para escapar y \\
para la barra invertida final.
echo -en "\033]11;?\033\\"
Salida:
^[]11;rgb:0000/0000/0000^[\
Advertencia: el color devuelto no refleja si el video inverso, como -rv
, está habilitado, y el rastreo a través de los ~ 260 colores disponibles OSC 4 ; c ; ? ST
no muestra ninguno que siga el fondo Y cambie con el video inverso. Dado que muchos usuarios establecen un fondo oscuro usando solo xterm -rv
, esto complica determinar si el fondo es realmente oscuro o no. La mayoría de los colores tampoco se ajustan a -rv
.
Un script para hacer la consulta completa y capturar la respuesta de xterm:
#!/bin/bash
success=false
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
col=11 # background
# OSC Ps ;Pt ST
echo -en "\033]${col};?\033\\" >/dev/tty # echo opts differ w/ OSes
result=
if IFS=';' read -r -d '\' color ; then
result=$(echo $color | sed 's/^.*\;//;s/[^rgb:0-9a-f/]//g')
success=true
fi
stty $oldstty
echo $result
$success