GNU/Linux >> Linux Esercitazione >  >> Linux

Dove viene impostato il termine Default della variabile di ambiente?

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 di

    S0: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 leggeva

    Environment=TERM=vt100

    impostando il TERM variabile nell'ambiente passata a agetty .

  • Sui BSD, init prende il tipo di terminale dal terzo campo della voce di ogni terminale nel /etc/ttys database e imposta TERM da quello nell'ambiente in cui esegue getty 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 o vc-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 leggono

    Environment=TERM=linux

    impostando il TERM variabile nell'ambiente passata a agetty .

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.

Linux
  1. Come impostare una variabile di ambiente sulla riga di comando e farla apparire nei comandi?

  2. Imposta la variabile di ambiente con lo spazio in Linux

  3. Come cambiare la lingua del mio git?

  4. Variabile di ambiente TERM non impostata

  5. Dov'è impostata la variabile d'ambiente $HOME?

Come impostare la variabile d'ambiente in Windows

Come impostare le variabili d'ambiente in MacOS

Come impostare l'emulatore di terminale predefinito di Gnome su Ubuntu 18.04 LTS

Come impostare il terminale predefinito (o window manager, browser e molto altro) in Linux

Come impostare la variabile d'ambiente in Bash

Qual è il modo migliore per impostare una variabile d'ambiente in .bashrc?