Quando apro una finestra di terminale con l'emulatore di terminale GNOME nella GUI del desktop, la variabile di ambiente TERM della shell viene impostata sul valore xterm
.
Se utilizzo CTL +ALT +F1 per passare a una finestra TTY della console e echo $TERM
il valore è impostato su linux
.
La mia motivazione per chiederlo è che all'interno del mio ~/.bashrc
file una variabile viene utilizzata per determinare se viene fornita una shell di colore o solo un buon monocromatico vecchio stile.
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color) color_prompt=yes;;
esac
Sia nella shell della console che nella shell dell'emulatore di Gnome Terminal se digito
export TERM=xterm-color
source /.bashrc
entrambe le shell cambiano in modalità colore (qualcosa che mi piacerebbe che accadesse sempre in entrambe).
Dove si trova il TERM
predefinito i valori vengono impostati per favore e qual è il posto migliore per modificare i loro valori predefiniti, se possibile? Non sembra esserci nulla nella GUI dell'emulatore di terminale per selezionare o impostare il valore TERM predefinito.
Ho pensato di aggiungere semplicemente la riga export TERM=xterm-color
all'inizio del mio ~/.bashrc
file ma il mio istinto mi dice che questa non è la soluzione migliore e le mie ricerche su Google non mi hanno ancora portato a una buona risposta.
Sto eseguendo Ubuntu 15.04 Desktop Edition (basato su Debian).
Risposta accettata:
In molti posti, a seconda
Su terminali virtuali e terminali reali, il TERM
la variabile di ambiente è impostata dal programma che si concatena a login
, e viene ereditato fino in fondo alla shell interattiva che viene eseguita una volta effettuato l'accesso. Dove, appunto, ciò accade varia da sistema a sistema, ea seconda del tipo di terminale.
terminali reali
I terminali reali, seriali, possono variare nel tipo, in base a ciò che si trova all'altra estremità del filo. Quindi convenzionalmente il getty
programma viene invocato con un argomento che specifica il tipo di terminale, oppure viene passato il TERM
programma dai dati di configurazione del servizio di un gestore del servizio.
- Su van Smoorenburg
init
sistemi, lo si può vedere in/etc/inittab
voci, che leggeranno qualcosa sulla falsariga diS0:3:respawn:/sbin/agetty ttyS0 9600 vt100-nav
L'ultimo argomento di
agetty
in quella riga,vt100-nav
, è il tipo di terminale impostato per/dev/ttyS0
. Quindi/etc/inittab
è dove cambiare il tipo di terminale per terminali reali su tali sistemi. - Sui sistemi systemd, uno era in grado di vederlo in
/usr/lib/systemd/system/[email protected]
file dell'unità (/lib/systemd/system/[email protected]
su sistemi non uniti), che leggevaEnvironment=TERM=vt100
impostando il
TERM
variabile nell'ambiente passata aagetty
. - Sui BSD,
init
prende il tipo di terminale dal terzo campo della voce di ogni terminale nel/etc/ttys
database e impostaTERM
da quello nell'ambiente in cui eseguegetty
insieme a. Quindi/etc/ttys
è dove si cambia il tipo di terminale per i terminali reali sui BSD.
Variabilità del sistema
Il [email protected]
file dell'unità di servizio, o file drop-in che si applicano ad esso, è dove cambiare il tipo di terminale per terminali reali su sistemi systemd. Tieni presente che tale modifica si applica a tutti servizi di accesso al terminale che utilizzano questo modello di unità di servizio. (Per cambiarlo solo per i singoli terminali, è necessario creare un'istanza manuale del modello o aggiungere drop-in che si applicano solo alle istanze.)
systemd ha avuto almeno quattro meccanismi durante la sua vita per raccogliere il valore di TERM
variabile d'ambiente. Al momento della prima stesura di questa risposta, come si può vedere, c'era un Environment=TERM=something
riga nei file dell'unità di servizio modello. Altre volte, i tipi linux
e vt102
erano cablati in getty
e serial-getty
rispettivamente i file dell'unità di servizio. Più recentemente, la variabile d'ambiente è stata ereditata dal processo n. 1, che l'ha impostata in vari modi.
A partire dal 2020, il modo in cui systemd decide quale tipo di terminale specificare nel TERM
di un servizio La variabile d'ambiente è piuttosto complessa e non è affatto documentata. Il modo per cambiarlo rimane un file di configurazione drop-in con Environment=TERM=something
. Ma da dove ha origine il valore predefinito è abbastanza variabile. Soggetto a regole abbastanza complesse da spiegare che coinvolgono il TTYPath=
impostazioni delle singole unità di servizio, può essere uno di tre valori:un linux
cablato , un vt220
cablato (non più vt102
), o il valore del TERM
variabile di ambiente che il processo n. 1 ha ereditato, di solito dal caricatore kernel/bootstrap.
(Ironia della sorte, il getttyent()
il meccanismo esiste ancora nella libreria GNU C e systemd potrebbe aver riutilizzato il /etc/ttys
meccanismo.)
terminali virtuali del kernel
I terminali virtuali del kernel, come hai notato, hanno un tipo fisso. A differenza di NetBSD, che può variare al volo il tipo di terminale virtuale del kernel, Linux e gli altri BSD hanno un unico tipo di terminale fisso implementato nel programma di emulazione di terminale integrato nel kernel. Su Linux, quel tipo corrisponde a linux
dal database terminfo. (L'emulazione del terminale del kernel di FreeBSD dalla versione 9 è stata teken
. Prima della versione 9 era cons25
OpenBSD è pccon
.)
- Sui sistemi che utilizzano
mingetty
ovc-get-tty
(dal pacchetto nosh) il programma "sa" che può parlare solo con un terminale virtuale e cablano i tipi di terminale virtuale "noti" appropriati al sistema operativo per cui il programma è stato compilato. - Sui sistemi systemd, uno era in grado di vederlo in
/usr/lib/systemd/system/[email protected]
file dell'unità (/lib/systemd/system/[email protected]
su sistemi non uniti), che leggonoEnvironment=TERM=linux
impostando il
TERM
variabile nell'ambiente passata aagetty
.
Per i terminali virtuali del kernel, uno non cambia il tipo di terminale Dopotutto, il programma dell'emulatore di terminale nel kernel non cambia. È errato per cambiare tipo. In particolare, questo rovinerà il riconoscimento della sequenza CSI del cursore/tasto di modifica. Il linux
Le sequenze CSI inviate dall'emulatore di terminale del kernel Linux sono diverse da xterm
o vt100
Sequenze CSI inviate da programmi di emulazione terminale GUI in modalità DEC VT. (In effetti, sono altamente idiosincratici e non standard, e diversi sia da tutti i terminali reali che conosco, sia da praticamente tutti gli altri emulatori di terminali software a parte quello integrato in Linux.)
Emulatori di terminale GUI
Il tuo emulatore di terminale GUI è uno dei tanti programmi, dal demone SSH a screen
, che utilizza pseudo-terminali. Il tipo di terminale dipende da quale programma di emulazione di terminale è in esecuzione sul lato master dello pseudo-terminale e da come è configurato. La maggior parte degli emulatori di terminale GUI avvierà il programma sul lato slave con un TERM
variabile il cui valore corrisponde alla loro emulazione terminale sul lato master. Programmi come il server SSH tenteranno di "passare attraverso" il tipo di terminale che si trova sul lato client della connessione. Di solito c'è qualche menu o opzione di configurazione da scegliere tra le emulazioni di terminale.
La mano che stringe
Il modo giusto per rilevare la capacità del colore è non per cablare un elenco di tipi di terminale nello script. Ci sono moltissimi tipi di terminali che supportano il colore.
Il modo giusto è guardare cosa dice termcap/terminfo sul tuo tipo di terminale.
colour=0 if tput Co > /dev/null 2>&1 then test "`tput Co`" -gt 2 && colour=1 elif tput colors > /dev/null 2>&1 then test "`tput colors`" -gt 2 && colour=1 fi
Ulteriori letture
- Jonathan de Boyne Pollard (2018).
TERM
. Guida al gusto . Software.