GNU/Linux >> Znalost Linux >  >> Linux

Kde se nastavuje výchozí proměnná prostředí?

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 smyslu

    S0:3:respawn:/sbin/agetty ttyS0 9600 vt100-nav

    Poslední argument pro agetty v tomto řádku vt100-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 četl

    Environment=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 nebo vc-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.

Linux
  1. Úplný pohled na to, kde je v Bash nastavena proměnná cesty?

  2. Nastavit proměnnou prostředí s prostorem v Linuxu

  3. Jak změnit jazyk mého git?

  1. Proměnná prostředí TERM není nastavena

  2. Kde je nastavena proměnná prostředí $HOME?

  3. Co je proměnná prostředí XDG_VTNR?

  1. Jak nastavit výchozí terminál (nebo správce oken, prohlížeč a mnoho dalšího) v Linuxu

  2. Jak zjistit, odkud se vzala proměnná prostředí?

  3. Kde je terminálový pohled na tty7