Die E-Mail von Thomas Dickey (Betreuer von xterm) hat dies. Beachten Sie insbesondere den Teil über ?
. Das Ps = 4
bezieht sich darauf, OSC Ps ; Pt ST
wo OSC
(das Präfix "Operating System Control") ESC ]
und ST
(das Suffix "String Terminator") \
(Backslash) ist. Das 4
ist eine der möglichen Subbefehle zu OSC.
Für die gesamte Palette kann dies mit der Farberweiterung 88/256 festgelegt / abgerufen werden. In ctlseqs.txt ist es hier zusammengefasst:
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.
Etwas später in den Dokumenten finden Sie weitere OSC-Unterbefehle Ps = 10
und Ps = 11
und andere.
Ps = 1 0 -> Change VT100 text foreground color to Pt.
Ps = 1 1 -> Change VT100 text background color to Pt.
Beispiel - Dies fragt den Hintergrund mit Ps = "11"
(von oben) und Pt = "?"
, eingesteckt in die OSC Ps ; Pt ST
. Im Echo \033
wird für die Flucht und \\
für den letzten Backslash verwendet.
echo -en "\033]11;?\033\\"
Ausgabe:
^[]11;rgb:0000/0000/0000^[\
Warnung: Die zurückgegebene Farbe gibt nicht an, ob das umgekehrte Video wie -rv
aktiviert ist, und das Crawlen durch die über ~ 260 verfügbaren Farben OSC 4 ; c ; ? ST
zeigt keine an, die beide dem Hintergrund folgen UND sich mit dem umgekehrten Video ändern. Da viele Benutzer mit just einen dunklen Hintergrund xterm -rv
festlegen, erschwert dies die Feststellung, ob der Hintergrund tatsächlich dunkel ist oder nicht. Die meisten Farben passen sich auch nicht an -rv
.
Ein Skript, mit dem die vollständige Abfrage ausgeführt und die Antwort von xterm erfasst werden kann:
#!/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