En général, l'obtention des couleurs actuelles est impossible. Le traitement de la séquence de contrôle d'un terminal se produit "à l'intérieur" du terminal, où que ce soit. Avec un émulateur de terminal tel que xterm
ou celui intégré dans un noyau de système d'exploitation qui fournit les terminaux virtuels du noyau, l'état interne de l'émulateur, y compris sa notion du "rendu graphique" actuel (c'est-à-dire la couleur et les attributs), est sur la machine lui-même et est théoriquement accessible. Mais pour un vrai terminal, ces informations se trouvent dans un emplacement RAM sur une machine physiquement séparée connectée via une liaison série.
Cela dit, certains terminaux incluent un mécanisme de lecture de ces informations dans le cadre de leur protocole de terminal, qui est envoyé sur cette liaison série. Ils fournissent des séquences de contrôle qu'un programme peut envoyer au terminal, qui lui font renvoyer des informations sur son état interne, en tant qu'entrée du terminal. mikeserv
vous a montré les séquences de contrôle auxquelles l' xterm
émulateur de terminal répond. Mais ceux-ci sont spécifiques à xterm
. Les émulateurs de terminaux intégrés dans le noyau Linux et les différents noyaux BSD sont par exemple différents types de terminaux et n'implémentent pas du tout de telles séquences de contrôle. Il en va de même pour des familles entières de terminaux réels.
Les terminaux DEC VT525 implémentent un mécanisme de lecture, mais ont un ensemble de séquences de contrôle qui n'a aucune relation avec celles utilisées par xterm
. On envoie la séquence DECRQSS (Request Selection or Setting) pour demander le rendu graphique actuel, et le terminal répond en envoyant le DECRPSS (Report Selection or Setting). Plus précisément:
- L'hôte envoie: DCS
$
q
m
ST (DECRQSS avec la partie fonction de contrôle de SGR comme paramètre)
- Le terminal répond: DCS
0
$
r
0
;
3
3
;
4
4
m
ST (DECRPSS avec les paramètres et la fonction de contrôle faisant partie d'une séquence de contrôle SGR qui définit les couleurs actuelles de premier plan et d'arrière-plan)
Bien sûr, une lecture attentive de votre question révèle que vous agitez à nouveau une banane enrobée de chocolat dans ces systèmes monétaires européens. Ce que vous essayez réellement de faire, pour lequel vous avez sélectionné une solution puis demandé comment faire une partie de cette solution, est de conserver l'état précédent pendant que vous écrivez une sortie colorisée. Non seulement il y a une séquence de contrôle DEC VT pour ce faire, mais il y a une séquence de terminaux de console SCO qui est reconnue par xterm
et divers émulateurs de terminaux intégrés au noyau, et une entrée termcap / terminfo qui vous indique ce qu'ils sont pour votre terminal.
Les entrées termcap sont sc
et rc
. Les entrées terminfo sont save_cursor
et restore_cursor
. Les noms sont quelque peu trompeurs quant à leur effet (bien qu'ils agissent comme un avertissement que vous comptez sur quelque chose qui est de facto plutôt que de jure ). Les séquences de contrôle DECSC, DECRC, SCOSC et SCORC réelles enregistrent et restaurent également le rendu graphique actuel.
Étant donné que l'article que vous avez souligné concerne la génération de séquences de contrôle à partir de scripts shell, la commande que vous recherchez maintenant l' est tput
.
Lectures complémentaires
echotc Co
ouechoti colors
, mais il n'y a tout simplement pas de variable qui stocke la définition actuelle du code couleur.