Quale tipo di terminale sto usando?


51

Ho provato questo con Ubuntu 12.04 e Debian 7. Quando lo faccio

echo $TERM

ottengo

xterm

Ma se uso il menu a discesa "help"> "about", allora dice gnome terminal 3.4.1.1.

Questo significa che sto usando solo gnome-terminal? O solo xterm? O gnome-terminal è un'estensione di xterm? Non ho capito bene.

Risposte:


49

A cosa serve $TERM?

La $TERMvariabile è utilizzata dalle applicazioni per sfruttare le funzionalità di quel terminale.

Ad esempio, se un programma desidera visualizzare testo colorato, deve prima scoprire se il terminale in uso supporta il testo colorato e, in tal caso, come eseguire il testo colorato.

Il modo in cui funziona è che il sistema mantiene una libreria di terminali noti e le loro capacità. Sulla maggior parte dei sistemi è presente /usr/share/terminfo(c'è anche termcap, ma il suo lascito non è più usato molto).

Supponiamo quindi che tu abbia un programma che vuole visualizzare testo rosso. Fondamentalmente effettua una chiamata alla libreria terminfo che dice " dammi la sequenza di byte che devo inviare per il testo rosso per il terminale xterm ". Quindi prende solo quei byte e li stampa.
Puoi provarlo tu stesso tput setf 4; echo hi. Questo otterrà la setfcapacità terminfo e gli passerà un parametro di 4, che è il colore desiderato.


Perché gnome terminal si trova su se stesso:

Ora supponiamo che tu abbia un nuovo brillante emulatore di terminale che è stato appena rilasciato, e la libreria terminfo del sistema non ha ancora una definizione per questo. Quando l'applicazione va a cercare come fare qualcosa, fallirà perché il terminale non è noto.

Il modo in cui il tuo terminale aggira questo è mentendo su chi è. Quindi il tuo terminale di gnome sta dicendo " I'm xterm ".

Xterm è un terminale molto semplice che esiste sin dagli albori di X11 e quindi la maggior parte degli emulatori di terminali supportano ciò che supporta. Quindi, da gnome terminal dicendo che è un xterm, è più probabile che abbia una definizione nella libreria terminfo.

L'aspetto negativo di mentire sul tipo di terminale è che il terminale potrebbe effettivamente supportare molto più di xterm (ad esempio, molti nuovi terminali supportano 256 colori, mentre i terminali più vecchi ne supportano solo 16). Quindi hai un compromesso, ottieni più funzionalità o hai più compatibilità. La maggior parte dei terminali opterà per una maggiore compatibilità e quindi sceglierà di pubblicizzarsi come xterm.

Se si desidera ignorare questo, molti terminali offriranno un modo per configurare il comportamento. Ma puoi anche farlo export TERM=gnome-terminal.


4
Raccomandare a qualcuno di esportare $ TERM sembra davvero di strofinare il sale in una ferita aperta ...
jasonwryan,

1
si. Sto indovinando che gli sviluppatori di sinistra gnome-terminal $TERMimpostato su xtermper una buona ragione
mulllhausen

4
@mulllhausen Questo motivo è ben spiegato nella mia risposta ...
Patrick,

27

La TERMvariabile d'ambiente indica il tipo di terminale , non l' applicazione terminale . TERMha uno scopo specifico: indica alle applicazioni in esecuzione in quel terminale come interagire con il terminale.

Le applicazioni interagiscono con i terminali scrivendo sequenze di escape: sequenze di caratteri che includono caratteri non stampabili e hanno effetti come spostare il cursore, cancellare parte dello schermo, cambiare il colore corrente, ecc. Ai vecchi tempi, diverse marche di terminali fisici avevano differenti serie di sequenze di escape. Pertanto, il sistema operativo mantiene un database di tipi di terminali e le loro caratteristiche. Il database tradizionale è termcap ("TERMinal CAPabilities"); molti sistemi e applicazioni moderni sono passati a terminfo . Entrambi i database sono indicizzati in base al nome del tipo di terminale e le applicazioni li interrogano utilizzando il nome del tipo di terminale dalle TERMvariabili di ambiente.

Al giorno d'oggi, la maggior parte dei terminali utilizza un set standard di sequenze di escape con alcuni set comuni di estensioni, quindi non vedrai molti valori diversi di TERM. La maggior parte degli emulatori di terminali GUI sono compatibili con xterm , il tradizionale terminale X (che è ancora usato e mantenuto).

Gli emulatori di terminale che differiscono da xterm possono aggiungere la propria voce al database dei terminali con il proprio nome. Tuttavia, ciò non si adatta bene alle shell remote. Un programma in esecuzione sulla macchina A ma che viene visualizzato sulla macchina B, ad esempio perché è stato avviato tramite ssh da B ad A, deve eseguire una query sul database del terminale sulla macchina A. I metodi di accesso remoto come ssh riportano la TERMvariabile di ambiente, ma questo è utile solo quando il database dei terminali di B ha anche una voce per l'utente di valore su A. Pertanto molti emulatori di terminali si attaccano a TERM=xtermcui è praticamente universalmente noto.

La differenziazione tra terminali in generale non deriva dal modo in cui le applicazioni interagiscono con essi, ma dal modo in cui i terminali interagiscono con l'utente e si adattano al loro ambiente. Ad esempio, Gnome Terminal ha un bell'aspetto su Gnome e offre schede e altri dettagli; Konsole ha un bell'aspetto su KDE e offre schede e altri contenuti; urxvt ha un piccolo requisito di memoria; Console2 funziona su Windows; screen e tmux forniscono sessioni che possono essere collegate a diversi terminali principali; e così via. Poiché nessuna di queste funzionalità fa la differenza per le applicazioni in esecuzione nel terminale, la maggior parte degli emulatori di terminali utilizzano TERM=xterm.

Per sapere quale terminale sta eseguendo una shell, guarda il genitore della shell:

ps -p$PPID

La corsa ps -p$PPIDnon sembra dirmi quale terminale sto correndo. O almeno non in un modo che capisco. Hai un esempio di output / risposta?
user3731622

@utente L'output è un gruppo di numeri e abbreviazioni criptiche seguite da una riga di comando. Nella maggior parte dei casi, la riga di comando è quella che ha avviato l'emulatore di terminale in cui è in esecuzione la shell.
Gilles 'SO-smetti di essere malvagio' il

12

La variabile di ambiente TERM non indica il terminale in uso.

Citando gnu.org :

La variabile d'ambiente TERM contiene un identificatore per le funzionalità della finestra di testo. Puoi ottenere un elenco dettagliato di queste cabability usando il comando> 'infocmp', usando 'man 5 terminfo' come riferimento.

Quando si produce testo con direttive sui colori incorporate, msgcat osserva la variabile TERM. Le finestre di testo oggi supportano in genere almeno 8 colori. Spesso, tuttavia, la finestra di testo supporta 16 o più colori, anche se la variabile TERM è impostata su un identificatore che indica solo 8 colori supportati. Può valere la pena impostare la variabile TERM su un valore diverso in questi casi:

xterm è nella maggior parte dei casi costruito con supporto per 16 colori. Può anche essere costruito con supporto per 88 o 256 colori (ma non entrambi). Puoi provare a impostare TERM su xterm-16color, xterm-88color o xterm-256color. rxvt

rxvt è spesso costruito con supporto per 16 colori. Puoi provare a impostare TERM su rxvt-16color. Konsole

anche la konsole è spesso costruita con supporto per 16 colori. Puoi provare a impostare TERM su konsole-16color o xterm-16color.

Dopo aver impostato TERM, è possibile verificarlo invocando 'msgcat --color = test' e vedere se l'output appare come una ragionevole mappa dei colori. La variabile d'ambiente TERM contiene un identificatore per le funzionalità della finestra di testo. È possibile ottenere un elenco dettagliato di queste cabability usando il comando 'infocmp', usando 'man 5 terminfo' come riferimento.

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.