Come e dove viene interpretato $ TERM?


9

Mi chiedo come funzioni un po 'di magia terminale all'interno.

Durante il gioco con i contenitori docker, la variabile di ambiente $TERMnon è stata impostata. Ciò ha portato ad applicazioni console dall'aspetto strano come vim e tmux, ma anche a CTRL + l (schermo trasparente) che è stato ignorato.

Sono abbastanza sicuro che tutte le funzionalità come gli aggiornamenti parziali dello schermo, i colori, i comandi come il ripristino dello schermo ecc. Vengano realizzati utilizzando i codici di escape, giusto?

Quindi, dove viene interpretata questa variabile e consente ad esempio di ripristinare la schermata del mio terminale usando CTRL + l se imposto il valore giusto lì? Chi controlla ad esempio quali colori sono supportati (xterm vs xterm-256color)? Il guscio? L'applicazione o una libreria come ncurses? E dove sono definiti i possibili valori / tipi di terminali?

Risposte:


8

$TERMviene letto e interpretato dal sistema terminfo. terminfo si riferisce anche al database delle descrizioni dei terminali che è possibile trovare sulla maggior parte dei sistemi in /usr/share/terminfo. $TERMdeve corrispondere a una delle voci in quel database. C'era anche una vecchia libreria chiamata termcap che aveva meno capacità, ma terminfo lo ha sostituito. Nei sistemi moderni, terminfo fa parte della libreria ncurses.

Le applicazioni di solito recuperano direttamente le funzionalità del terminale utilizzando funzioni di libreria simili tigetstr()o usano interfacce maledizioni di livello superiore per gestire il layout dello schermo. In entrambi i casi, $TERMverrà consultato il database terminfo.


5

La TERMvariabile viene interpretata da ciascuna applicazione, tramite le librerie di sistema. Il suo valore è un nome che viene cercato in un database. A seconda del sapore di Unix e della sua età, il database può essere sia termcap (tradizionale, non utilizzato molto al giorno d'oggi) o terminfo (moderno, in quanto era inteso come un miglioramento sul termcap e utilizzato dalla maggior parte dei sistemi al giorno d'oggi).

Entrambi i database termcap e terminfo associano i nomi delle capacità ai valori. Le capacità sono descrizioni di ciò che il terminale può fare (numero di linee, capacità di sottolineare, ecc.) O stringhe che possono essere scambiate con il terminale (scappare sequenze per formattare il testo, spostare il cursore, ecc., E nell'altro sequenze di escape della direzione inviate dai tasti funzione). Puoi guardare man 5 termcape man 5 terminfovedere quali funzionalità sono note sul tuo sistema.

Ad esempio, quando si preme Ctrl+ Lper ridisegnare lo schermo, vengono visualizzate le funzionalità nel database del terminale per scoprire quali sequenze di escape devono utilizzare per spostare il cursore. Se TERMnon è impostato o impostato in modo errato, lo schermo non ha modo di sapere come spostare il cursore.

È possibile utilizzare il tputcomando per recuperare le voci nel database terminfo. Ad esempio, tput linesstampa il numero di linee sul terminale. tput clearcancella lo schermo (perché il suo output viene stampato sul terminale); per vedere qual è la sequenza di escape corrispondente, stampala in una forma leggibile, ad es tput clear | cat -v.

Il numero di colori ha un po 'di storia che non lo fa funzionare come dovrebbe per diritto: gli emulatori terminali tendono a sottostimare il loro numero di colori, per evitare di rompere alcune applicazioni. Vedi il supporto di tmux, TERM e 256 colori per ulteriori informazioni al riguardo, in particolare nel contesto di tmux. La differenza tra xterm-256colorse xtermè che il primo riporta 256 colori in terminfo mentre il secondo riporta il tradizionale 8.


2

TERM, per convenzione si riferisce a una descrizione terminale. Originariamente questo chiamava una sezione di un file di testo termcap (a partire dalla fine degli anni '70). A metà degli anni '80, terminfo è stato introdotto come un file compilato (binario) che ha permesso di risparmiare tempo quando si è ottenuta la descrizione del terminale. Mentre entrambi sono disponibili per tutte le piattaforme simili a Unix, termcap viene usato raramente oggi tranne che come emulazione usando terminfo.

Per entrambi questi formati di dati, le applicazioni di solito estraggono i dati dal database dei terminali con librerie di programmazione riutilizzabili. La libreria di programmazione terminfo di solito fa parte della libreria curses di livello superiore sebbene possa essere fornita (ad esempio, facoltativamente come in ncurses) come file di libreria separato. Se la libreria terminfo è fornita separatamente o meno, in questi casi è considerata parte della libreria curses. (Ci sono anche alcune altre librerie di livello superiore come il gergo).

La voce del database del terminale per ciascun terminale contiene proprietà denominate capacità . Dicono alla libreria curses (o alle applicazioni che usano direttamente termcap / terminfo) come fare operazioni utili come cancellare lo schermo. Per la maggior parte dei terminali questa è una sequenza di escape. Alcuni terminali potrebbero non supportare una sequenza di escape per questo scopo; ci sono altre funzionalità che possono essere combinate dalla libreria di maledizioni per cancellare lo schermo (come cancellare ogni riga). Non tutte le funzionalità sono sequenze di escape. Ci sono anche funzioni booleane e numeriche , ad esempio per dire se una funzione è supportata e quanto è grande qualcosa (come le dimensioni dello schermo).

Ogni applicazione che utilizza termcap / terminfo utilizza la libreria corrispondente per recuperare la descrizione del terminale, nonché per eseguire operazioni come la sostituzione di parametri in determinate funzionalità. Ad esempio, la maggior parte dei terminali offre la possibilità di spostare il cursore di un determinato numero di colonne o righe dalla posizione corrente. Le funzioni tparm(o tiparm) sostituiscono il numero nella capacità di ottenere la sequenza di escape effettiva.

La libreria curses ha applicazioni da riga di comando che mantengono il database dei terminali ( tic , infocmp ) e alcuni che vengono utilizzati negli script della shell per interrogare il database dei terminali o eseguire operazioni di basso livello con funzionalità terminali ( tput , tset / reset ).

Esistono applicazioni non convenzionali che utilizzano TERMsenza utilizzare il database dei terminali. La maggior parte di questi semplicemente codifica il loro comportamento (come GNU grep, groff e i browser Web testuali links / links2 / elinks), mentre alcuni hanno ciò che equivale al proprio database terminale (come GNU ls), ma usando regole e comportamento.

Torna alle domande:

  • Quindi, dove viene interpretata questa variabile e consente ad esempio di ripristinare la schermata del mio terminale usando CTRL + l se imposto il valore giusto lì?

    L'applicazione e le librerie sottostanti interpretano questo valore. Per controlL, ciò può essere fatto per bash nella libreria readline (che utilizza un'interfaccia di programmazione termcap).

  • Chi controlla ad esempio quali colori sono supportati (xterm vs xterm-256color)?

    Il database del terminale memorizza il numero di colori come funzionalità, insieme a funzionalità per l'impostazione dei colori di primo piano e di sfondo e il ripristino dei colori. Alcune applicazioni combinano queste capacità con altre informazioni (come l'affermazione di uno sviluppatore che xtermè "realmente" xterm-256color).

  • Il guscio?

    La maggior parte delle shell utilizza un'interfaccia di programmazione termcap per ottenere le informazioni sul terminale. Tuttavia, sono applicazioni che hanno un loro comportamento (non necessariamente uguale alle maledizioni).

  • L'applicazione o una libreria come ncurses?

    (vedi sopra: le shell sono un particolare tipo di applicazione)

  • E dove sono definiti i possibili valori / tipi di terminali?

    Di solito si trova in un database terminale condiviso da applicazioni che usano le librerie di maledizioni o slang. Alcune applicazioni sono codificate o utilizzano un database privato.

Ulteriori letture:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.