Když otevřu okno terminálu s emulátorem terminálu GNOME v grafickém rozhraní plochy, proměnná prostředí TERM prostředí má výchozí hodnotu xterm
.
Pokud používám CTL +ALT +F1 pro přepnutí do okna TTY konzoly a echo $TERM
hodnota je nastavena na linux
.
Moje motivace pro dotaz je, že uvnitř mého ~/.bashrc
soubor proměnná se používá k určení, zda je poskytován barevný shell nebo jen dobrý staromódní monochromatický.
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color) color_prompt=yes;;
esac
V prostředí konzoly i v prostředí emulátoru terminálu Gnome, pokud napíšu
export TERM=xterm-color
source /.bashrc
obě skořápky se změní na barevný režim (což bych chtěl, aby se vždy dělo v obou).
Kde je výchozí TERM
prosím nastavte hodnoty a kde je nejlepší místo pro změnu jejich výchozích hodnot, pokud je to vůbec možné? Zdá se, že v grafickém uživatelském rozhraní emulátoru terminálu není nic pro výběr nebo nastavení výchozí hodnoty TERM.
Uvažoval jsem jen o přidání řádku export TERM=xterm-color
na začátek mého ~/.bashrc
ale můj instinkt mi říká, že to není nejlepší řešení a moje vyhledávání na Googlu mě ještě nepřivedlo ke správné odpovědi.
Používám Ubuntu 15.04 Desktop Edition (založeno na Debianu).
Přijatá odpověď:
V závislosti na mnoha místech
Na virtuálních terminálech a skutečných terminálech TERM
proměnná prostředí je nastavena programem, který se připojuje k login
, a je zděděna celou cestu do interaktivního shellu, který se spustí, jakmile se člověk přihlásí. Kde přesně k tomu dojde, se liší systém od systému a podle druhu terminálu.
skutečné terminály
Skutečné, sériové, terminály se mohou lišit v typu, podle toho, co je na druhém konci drátu. Takže konvenčně getty
program je vyvolán s argumentem, který určuje typ terminálu, nebo je předán TERM
program z konfiguračních dat služby správce služeb.
- Na van Smoorenburg
init
systémy, lze to vidět v/etc/inittab
záznamy, které budou číst něco ve smysluS0:3:respawn:/sbin/agetty ttyS0 9600 vt100-nav
Poslední argument pro
agetty
v tomto řádkuvt100-nav
, je typ terminálu nastavený pro/dev/ttyS0
. Takže/etc/inittab
je místo, kde lze v takových systémech změnit typ terminálu pro skutečné terminály. - Na systémech systemd to bylo možné vidět v
/usr/lib/systemd/system/[email protected]
soubor jednotky (/lib/systemd/system/[email protected]
na nesloučených systémech), který dříve četlEnvironment=TERM=vt100
nastavení
TERM
proměnná v prostředí předanáagetty
. - Na BSD
init
přebírá typ terminálu ze třetího pole položky každého terminálu v/etc/ttys
databáze a nastavíTERM
z toho v prostředí, které spouštígetty
s. Takže/etc/ttys
je místo, kde se mění typ terminálu za skutečné terminály na BSD.
variabilita systemd
[email protected]
soubor servisních jednotek nebo soubory drop-in, které se na ně vztahují, je místo, kde lze změnit typ terminálu pro skutečné terminály v systémech systemd. Upozorňujeme, že taková změna se týká všech služby přihlášení k terminálu, které využívají tuto šablonu servisní jednotky. (Chcete-li to změnit pouze pro jednotlivé terminály, musíte ručně vytvořit instanci šablony nebo přidat drop-in, které se vztahují pouze na instanci.)
systemd měl během své existence alespoň čtyři mechanismy pro získání hodnoty TERM
proměnná prostředí. V době prvního psaní této odpovědi, jak je vidět, existovalo Environment=TERM=something
řádek v souborech šablon servisních jednotek. Jindy typy linux
a vt102
byly pevně zapojeny do getty
a serial-getty
soubory servisních jednotek. Nedávno byla proměnná prostředí zděděna z procesu #1, který ji nastavil různými způsoby.
Od roku 2020 způsob, jakým systemd rozhoduje, jaký typ terminálu specifikovat v TERM
služby Proměnná prostředí je poměrně složitá a není vůbec zdokumentována. Způsob, jak to změnit, zůstává konfigurační soubor typu drop-in s Environment=TERM=something
. Ale odkud pochází výchozí hodnota je dosti variabilní. S výhradou některých poměrně složitých pravidel pro vysvětlení, která zahrnují TTYPath=
nastavení jednotlivých servisních jednotek, může to být jedna ze tří hodnot:pevně připojený linux
, pevně připojený vt220
(již ne vt102
), nebo hodnotu TERM
proměnná prostředí, která proces č. 1 zdědí, obvykle ze zavaděče jádra/bootstrapu.
(Ironií je, že getttyent()
mechanismus stále existuje v knihovně GNU C a systemd mohl znovu použít /etc/ttys
mechanismus.)
virtuální terminály jádra
Virtuální terminály jádra, jak jste si všimli, mají pevný typ. Na rozdíl od NetBSD, který může měnit typ virtuálního terminálu jádra za chodu, Linux a ostatní BSD mají jeden pevný typ terminálu implementovaný v jádře vestavěném programu pro emulaci terminálu. V Linuxu tento typ odpovídá linux
z databáze terminfo. (Emulace terminálu jádra FreeBSD od verze 9 byla teken
. Před verzí 9 to bylo cons25
OpenBSD je pccon
.)
- Na systémech používajících
mingetty
nebovc-get-tty
(z balíčku nosh) program „ví“, že může mluvit pouze s virtuálním terminálem, a pevně zapojí „známé“ typy virtuálních terminálů vhodné pro operační systém, pro který byl program zkompilován. - Na systémech systemd to bylo možné vidět v
/usr/lib/systemd/system/[email protected]
soubor jednotky (/lib/systemd/system/[email protected]
na nesloučených systémech), který zníEnvironment=TERM=linux
nastavení
TERM
proměnná v prostředí předanáagetty
.
U virtuálních terminálů jádra jeden není změnit typ terminálu. Program emulátoru terminálu v jádře se koneckonců nemění. Je nesprávná pro změnu typu. Zejména to pokazí rozpoznávání sekvence CSI kurzoru/úpravy. linux
Sekvence CSI zasílané emulátorem terminálu linuxového jádra se liší od xterm
nebo vt100
CSI sekvence odeslané programy emulátoru terminálu GUI v režimu DEC VT. (Ve skutečnosti jsou vysoce výstřední a nestandardní a liší se jak od všech skutečných terminálů, které znám, tak od všech ostatních softwarových emulátorů terminálů kromě toho, který je zabudovaný v Linuxu.)
emulátory terminálu GUI
Váš terminálový emulátor GUI je jedním z mnoha programů, od démona SSH po screen
, který používá pseudoterminály. Typ terminálu závisí na tom, jaký program emulátoru terminálu běží na hlavní straně pseudoterminálu a jak je nakonfigurován. Většina emulátorů terminálu GUI spustí program na podřízené straně pomocí TERM
proměnná, jejíž hodnota odpovídá jejich emulaci terminálu na hlavní straně. Programy, jako je server SSH, se pokusí „projít“ typem terminálu, který je na straně klienta připojení. Obvykle je mezi emulacemi terminálu k dispozici nějaká nabídka nebo možnost konfigurace.
Svírající ruka
Správný způsob, jak zjistit schopnost barev, je ne k vytvoření seznamu typů terminálů ve vašem skriptu. Existuje strašná spousta typů terminálů, které podporují barvu.
Správný způsob je podívat se, co termcap/terminfo říká o vašem typu terminálu.
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
Další čtení
- Jonathan de Boyne Pollard (2018).
TERM
. průvodce nosem . Software.