Dove viene impostata la variabile d'ambiente TERM impostata?


26

Quando apro una finestra di terminale con l'emulatore di Terminale GNOME nella GUI del desktop, la variabile di ambiente TERM della shell assume come valore predefinito xterm.

Se uso CTL+ ALT+ F1per passare a una finestra TTY della console e echo $TERMil valore è impostato su linux.

La mia motivazione per chiedere è che all'interno del mio ~/.bashrcfile venga utilizzata una variabile per determinare se viene fornita una shell di colore o solo un buon monocromo 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 Gnome Terminal, se digito

export TERM=xterm-color
source /.bashrc

entrambi i gusci passano alla modalità colore (qualcosa che mi piacerebbe che accadesse sempre in entrambi).

Dove TERMvengono impostati i valori predefiniti per favore e qual è il posto migliore per modificare le impostazioni predefinite, se possibile? Sembra che non ci sia nulla nella GUI dell'emulatore di terminale per selezionare o impostare il valore TERM predefinito.

Ho preso in considerazione solo l'aggiunta della riga export TERM=xterm-colorall'inizio del mio ~/.bashrcfile, 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).


Risposte:


17

In molti posti, a seconda

Sui terminali virtuali e terminali reali, la TERMvariabile d'ambiente è impostata dal programma a cui è concatenata logine viene ereditata fino in fondo alla shell interattiva che viene eseguita una volta effettuato l'accesso. Dove, precisamente, ciò accade varia da sistema a sistema e in base al tipo di terminale.

I terminali reali, seriali, possono variare nel tipo, in base a ciò che si trova all'altra estremità del filo. Quindi, convenzionalmente, il gettyprogramma viene invocato con un argomento che specifica il tipo di terminale o viene passato al TERMprogramma dai dati di configurazione del servizio di un gestore servizi.

  • Sui initsistemi di van Smoorenburg , si può vedere questo nelle /etc/inittabvoci, che leggerà qualcosa sulla falsariga di

    S0: 3: respawn: / sbin / agetty ttyS0 9600 vt100-nav
    L'ultimo argomento agettyin 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.
  • Su sistemi systemd, si può vedere questo nel /usr/lib/systemd/system/serial-getty@.servicefile di unità ( /lib/systemd/system/serial-getty@.servicesu sistemi non uniti), che legge

    Ambiente = TERM = vt100
    impostando la TERMvariabile nell'ambiente passato a agetty. Questo file di unità di servizio è dove modificare il tipo di terminale per terminali reali su tali sistemi. Si noti che si applica a tutti i terminali reali che utilizzano questo modello di unità di servizio. (Per modificarlo solo per i singoli terminali, è necessario creare un'istanza manuale del modello.)
  • Su BSD, initprende il tipo di terminale dal terzo campo della voce di ciascun terminale nel /etc/ttysdatabase e imposta TERMda quello nell'ambiente con cui viene eseguito getty. Quindi /etc/ttysè dove si cambia il tipo di terminale per terminali reali sui BSD.

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 singolo tipo di terminale fisso implementato nel programma di emulazione terminale incorporato del kernel. Su Linux, quel tipo corrisponde linuxal database terminfo. (L'emulazione del terminale del kernel di FreeBSD è un xtermsottoinsieme limitato dalla versione 9.)

  • Sui sistemi che utilizzano mingettyo vc-get-tty(dal pacchetto nosh) il programma "sa" che può parlare solo con un terminale virtuale, e cablano i tipi di terminali virtuali "noti" appropriati al sistema operativo per cui è stato compilato il programma.
  • Su sistemi systemd, si può vedere questo nel /usr/lib/systemd/system/getty@.servicefile di unità ( /lib/systemd/system/getty@.servicesu sistemi non uniti), che legge

    Ambiente = TERM = linux
    impostando la TERMvariabile nell'ambiente passato a agetty.

Per i terminali virtuali del kernel, non si cambia il tipo di terminale. Dopotutto, il programma di emulazione terminale nel kernel non cambia. Non è corretto cambiare il tipo. In particolare, ciò rovinerà il riconoscimento della sequenza CSI del tasto cursore / modifica. Le linuxsequenze CSI inviate dall'emulatore di terminale del kernel Linux sono diverse dalle sequenze CSI xtermo vt100inviate dai programmi di emulazione del terminale GUI in modalità DEC VT.

L'emulatore di terminale GUI è uno dei tanti programmi, dal SSH dæmon a screen, che utilizza pseudo-terminali. Qual è 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 terminali GUI avvia il programma sul lato slave con una TERMvariabile il cui valore corrisponde all'emulazione del terminale sul lato master. Programmi come il server SSH tenteranno di "passare" il tipo di terminale che si trova sul lato client della connessione. Di solito c'è un menu o un'opzione di configurazione per scegliere tra emulazioni di terminale.

La mano avvincente

Il modo giusto per rilevare la capacità di colore non è cablare un elenco di tipi di terminali nello script. Esistono moltissimi tipi di terminali che supportano il colore.

Il modo giusto è guardare cosa dice termcap / terminfo sul tuo tipo di terminale.

colore = 0
se tput Co> / dev / null 2> & 1
poi
    test "` tput Co` "-gt 2 && color = 1
elif tput colors> / dev / null 2> & 1
poi
    test "` tput colors` "-gt 2 && color = 1
fi

Ulteriori letture

  • Jonathan de Boyne Pollard (2018). TERM. Guida di nosh . Software.

Esiste quanto segue nel .bashrc default in Debian Jessie: [ -x /usr/bin/tput ] && /usr/bin/tput setaf 1 >&/dev/null && color_prompt=yes. (ncurses 5.9)
thom_nic

2
tput CoRestituisce anche "capacità terminfo sconosciuta" in Jessie e Xenial. tput colorsed tput setaf 1entrambi sembrano funzionare anche se ammetto di non capire il perché .
thom_nic

2

Si prega di consultare /ubuntu//a/614714/398785 per la mia risposta dettagliata sul perché ritengo che TERM=xterm-colorl'approccio sbagliato e quello di Ubuntu .bashrcsia obsoleto. Ti consiglio di andare con TERM=xterm-256color(che è il default dal gnome-terminal 3.16, ma anche sicuro da usare con i vecchi gnome-terminal) e di regolare di .bashrcconseguenza.


1
+1 per il tuo link. Piccolo suggerimento; la frase seguente potrebbe essere fonte di confusione (ho prima avuto l'impressione che stavi dicendo che l'uso .bashrcè obsoleto). "Ubuntu .bashrc è obsoleto."
IsaacS,

@IsaacS Hai qualche suggerimento su come migliorarlo? Ad esempio, sostituire "obsoleto" con un aiuto "obsoleto"?
egmont,

1
Sembra che xterm-256colorcausi htopdi rovinare il suo layout in questo modo in Ubuntu 18.04.
Smetti di fare del male a Monica il

@OrangeDog In quale emulatore di terminale? Questa domanda qui e quindi la mia risposta si concentra sul Terminale GNOME, mentre la pagina che hai collegato mostra Konsole. Il bug sembra che l'emulatore di terminale non supporti ancora la sequenza di escape REP che ncurses ha iniziato a usare in quel periodo. VTE (Terminale GNOME) aveva già aggiunto il supporto in Ubuntu 18.04, è probabile che Konsole non lo avesse fatto. Ho il sospetto che il tuo commento con la rottura dell'htop sia valido per Konsole ma non per GNOME Terminal.
egmont

@egmont non può parlare per il problema originale, ma ottengo lo stesso risultato con il terminale WSL (qualunque cosa sia).
Smetti di fare del male a Monica il
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.