In generale, ottenere i colori attuali è impossibile. L'elaborazione della sequenza di controllo di un terminale avviene "all'interno" del terminale, ovunque si trovi. Con un emulatore di terminale come xterm
o quello incorporato in un kernel del sistema operativo che fornisce i terminali virtuali del kernel, lo stato interno dell'emulatore, inclusa la sua nozione dell'attuale "rappresentazione grafica" (cioè colore e attributi), è sulla macchina stesso ed è teoricamente accessibile. Ma per un terminale reale questa informazione si trova in una posizione della RAM su una macchina fisicamente separata connessa tramite un collegamento seriale.
Detto questo, alcuni terminali includono un meccanismo per leggere tali informazioni come parte del loro protocollo terminale, che viene inviato tramite quel collegamento seriale. Forniscono sequenze di controllo che un programma può inviare al terminale, che gli fanno inviare informazioni sul suo stato interno, come input del terminale. mikeserv
ti ha mostrato le sequenze di controllo a cui l' xterm
emulatore di terminale risponde. Ma questi sono specifici di xterm
. Gli emulatori di terminali integrati nel kernel Linux e i vari kernel BSD sono diversi tipi di terminali, ad esempio, e non implementano affatto tali sequenze di controllo. Lo stesso vale per intere famiglie di terminali reali.
I terminali DEC VT525 implementano un meccanismo di lettura, ma hanno una serie di sequenze di controllo che non hanno alcuna relazione con quelle utilizzate da xterm
. Uno invia la sequenza DECRQSS (Richiedi selezione o impostazione) per richiedere la rappresentazione grafica corrente e il terminale risponde inviando il DECRPSS (Selezione o impostazione rapporto). In particolare:
- L'host invia: DCS
$
q
m
ST (DECRQSS con la funzione di controllo parte di SGR come impostazione)
- Il terminale risponde: DCS
0
$
r
0
;
3
3
;
4
4
m
ST (DECRPSS con i parametri e la funzione di controllo parte di una sequenza di controllo SGR che imposta i colori di primo piano e di sfondo correnti)
Naturalmente, un'attenta lettura della tua domanda rivela che stai agitando di nuovo una banana ricoperta di cioccolato in quei sistemi monetari europei. Quello che stai effettivamente cercando di fare, per il quale hai selezionato una soluzione e poi chiesto come fare parte di quella soluzione, è preservare lo stato precedente mentre scrivi un output colorato. Non solo esiste una sequenza di controllo DEC VT per fare questo, c'è una sequenza terminale della console SCO per essa riconosciuta da xterm
vari emulatori di terminali incorporati nel kernel e una voce termcap / terminfo che ti dice cosa sono per il tuo terminale.
Le voci termcap sono sc
e rc
. Le voci terminfo sono save_cursor
e restore_cursor
. I nomi sono in qualche modo fuorvianti per quanto riguarda l'effetto (anche se fungono da avvertimento che stai facendo affidamento su qualcosa che è di fatto piuttosto che di diritto ). Le sequenze di controllo DECSC, DECRC, SCOSC e SCORC effettive salvano e ripristinano anche la rappresentazione grafica corrente.
Dato che l'articolo che hai indicato riguarda la generazione di sequenze di controllo dagli script di shell, il comando che stai cercando ora è tput
.
Ulteriori letture
echotc Co
oechoti colors
, ma semplicemente non esiste alcuna variabile che memorizzi l'attuale definizione del codice colore.