Gdzie ustawiana jest domyślna zmienna środowiskowa TERM?

26

Kiedy otwieram okno terminala za pomocą emulatora terminala GNOME w graficznym graficznym interfejsie użytkownika, zmienna środowiskowa TERM powłoki domyślnie przyjmuje wartość xterm.

Jeśli użyję CTL+ ALT+, F1aby przejść do okna TTY konsoli, a echo $TERMwartość zostanie ustawiona na linux.

Motywuję, aby zapytać, że w moim ~/.bashrcpliku używana jest zmienna w celu ustalenia, czy jest zapewniona powłoka koloru, czy po prostu dobry staromodny monochromatyczny.

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color) color_prompt=yes;;
esac

Zarówno w konsoli, jak i w emulatorze Gnome Terminal, jeśli piszę

export TERM=xterm-color
source /.bashrc

obie powłoki zmieniają się w tryb koloru (coś, co chciałbym, aby zawsze działo się w obu).

Gdzie TERMnależy ustawić wartości domyślne i gdzie najlepiej zmienić ich wartości domyślne, jeśli to w ogóle możliwe? Wygląda na to, że w graficznym interfejsie emulatora terminali nic nie jest w stanie wybrać lub ustawić domyślnej wartości TERM.

Zastanawiałem się nad dodaniem wiersza export TERM=xterm-colorna początku mojego ~/.bashrcpliku, ale mój instynkt podpowiada, że ​​nie jest to najlepsze rozwiązanie, a moje wyszukiwania w Google nie dały mi jeszcze dobrej odpowiedzi.

Używam Ubuntu 15.04 Desktop Edition (na podstawie Debiana).

Andy Fusniak
źródło

Odpowiedzi:

17

W wielu miejscach, w zależności

W terminalach wirtualnych i rzeczywistych TERMzmienna środowiskowa jest ustawiana przez program, który loginłączy się z nią i jest dziedziczona przez całą drogę do interaktywnej powłoki, która jest wykonywana po zalogowaniu. Gdzie dokładnie to się dzieje, zależy od systemu i od rodzaju terminala.

Rzeczywiste, szeregowe zaciski mogą różnić się typem, w zależności od tego, co znajduje się na drugim końcu przewodu. Zatem konwencjonalnie gettyprogram jest wywoływany z argumentem określającym typ terminala lub jest przekazywany do TERMprogramu z danych konfiguracyjnych usługi menedżera usług.

  • W initsystemach van Smoorenburga można to zobaczyć we /etc/inittabwpisach, które przeczytają coś podobnego do

    S0: 3: respawn: / sbin / agetty ttyS0 9600 vt100-nav
    Ostatnim argumentem agettyw tym wierszu vt100-navjest ustawiony typ terminala /dev/ttyS0. Więc /etc/inittabgdzie zmienić typ terminala dla prawdziwych terminali w takich systemach.
  • W systemach systemd można to zobaczyć w /usr/lib/systemd/system/[email protected]pliku jednostki ( /lib/systemd/system/[email protected]w systemach niepołączonych ), który czyta

    Środowisko = TERM = vt100
    ustawienie TERMzmiennej w przekazanym środowisku agetty. W tym pliku jednostki usługowej można zmienić typ terminala dla prawdziwych terminali w takich systemach. Należy pamiętać, że dotyczy to wszystkich rzeczywistych terminali, które wykorzystują ten szablon jednostki serwisowej. (Aby zmienić go tylko dla poszczególnych terminali, należy ręcznie utworzyć szablon).
  • Na BSD initpobiera typ terminala z trzeciego pola wpisu każdego terminala w /etc/ttysbazie danych i ustawia TERMz tego w środowisku, w którym wykonuje getty. Tak więc /etc/ttyszmienia się typ terminala dla prawdziwych terminali na BSD.

Wirtualne terminale jądra, jak zauważyłeś, mają stały typ. W przeciwieństwie do NetBSD, który może zmieniać typ terminala wirtualnego jądra w locie, Linux i inne BSD mają jeden stały typ terminala zaimplementowany we wbudowanym programie emulacji terminalu jądra. W systemie Linux ten typ pasuje linuxdo bazy danych terminfo. (Emulacja terminala jądra FreeBSD jest ograniczonym xtermpodzbiorem od wersji 9.)

  • W systemach używających mingettylub vc-get-tty(z pakietu nosh) program „wie”, że może rozmawiać tylko z terminalem wirtualnym, i podłączają „znane” typy terminali wirtualnych odpowiednie dla systemu operacyjnego, dla którego program został skompilowany.
  • W systemach systemd można to zobaczyć w /usr/lib/systemd/system/[email protected]pliku jednostki ( /lib/systemd/system/[email protected]w systemach niepołączonych ), który czyta

    Środowisko = TERM = linux
    ustawienie TERMzmiennej w przekazanym środowisku agetty.

W przypadku wirtualnych terminali jądra nie zmienia się typu terminala. W końcu program emulatora terminala w jądrze się nie zmienia. Zmiana typu jest nieprawidłowa . W szczególności spowoduje to spowolnienie rozpoznawania sekwencji kursora / klawisza edycji CSI. Te linuxsekwencje CSI wysłane przez emulator terminala Linux Kernel różnią się od xtermlub vt100sekwencji CSI wysłanych przez GUI programów emulator terminala w trybie grudnia VT.

Twój emulator terminala GUI jest jednym z wielu programów, od SSH dæmon do screen, który używa pseudoterminalów. To, jaki jest typ terminala, zależy od tego, jaki program emulatora terminali działa po stronie master pseudo-terminala oraz od jego konfiguracji. Większość emulatorów terminali GUI uruchomi program po stronie slave ze TERMzmienną, której wartość odpowiada emulacji terminala po stronie master. Programy takie jak serwer SSH będą próbowały „przekazać” typ terminala znajdujący się na klienckim końcu połączenia. Zwykle istnieje emulacja menu lub opcji konfiguracji spośród emulacji terminala.

Chwytająca ręka

Właściwym sposobem na wykrycie możliwości koloru nie jest podłączenie na stałe listy typów terminali w skrypcie. Istnieje bardzo dużo typów terminali obsługujących kolory.

Właściwy sposób to sprawdzenie, co termcap / terminfo mówi o twoim typie terminala.

kolor = 0
jeśli tput Co> / dev / null 2> i 1
następnie
    test „tput Co” -gt 2 && color = 1
kolory tif elif> / dev / null 2> i 1
następnie
    test „tput kolory” -gt 2 && color = 1
fi

Dalsza lektura

  • Jonathan de Boyne Pollard (2018). TERM. Przewodnik nosh . Oprogramowania.
JdeBP
źródło
Dodaje się w domyślnym .bashrc w Jessie Debianie istnieje: [ -x /usr/bin/tput ] && /usr/bin/tput setaf 1 >&/dev/null && color_prompt=yes. (ncurses 5.9)
thom_nic
2
tput CoZwraca także „nieznane możliwości terminfo” w Jessie i Xenial. tput colorsi tput setaf 1oba wydają się działać, chociaż przyznaję, że nie rozumiem dlaczego .
thom_nic
2

Proszę zobaczyć /ubuntu//a/614714/398785 dla mojej szczegółowej odpowiedzi na pytanie, dlaczego uważam, że TERM=xterm-colorjest to niewłaściwe podejście, a system Ubuntu .bashrcjest przestarzały. Zalecam skorzystanie z TERM=xterm-256color(który jest domyślny od gnome-terminal 3.16, ale również bezpieczny w przypadku starszych terminali gnome) i odpowiednio dostosować .bashrc.

egmont
źródło
1
+1 dla twojego linku. Drobne sugestie; poniższe zdanie może być mylące (najpierw miałem wrażenie, że mówisz, że używanie .bashrcjest przestarzałe). „Plik .bashrc Ubuntu jest przestarzały.”
Izaak
@IsaacS Czy masz jakieś sugestie, jak to poprawić? Np. Czy zastąpiłby „przestarzałe” pomocą „nieaktualną” pomocą?
egmont
1
Wydaje się, że xterm-256colorprzyczyny htopbałagan jego układ jak ten w Ubuntu 18.04.
Stop Harming Monica
@OrangeDog W którym emulatorze terminali? To pytanie tutaj, a zatem moja odpowiedź, koncentruje się na Terminalu GNOME, podczas gdy strona, którą podłączyłeś, pokazuje Konsole. Błąd wygląda na to, że emulator terminala nie obsługuje jeszcze sekwencji ucieczki REP, z której ncurses zaczął korzystać w tym czasie. VTE (terminal GNOME) dodał już obsługę tego w Ubuntu 18.04, są szanse, że Konsole tego nie zrobił. Podejrzewam, że twój komentarz z łamaniem htopa dotyczy Konsoli, ale nie dotyczy GNOME Terminal.
egmont
@egmont nie może mówić za pierwotnym problemem, ale otrzymuję ten sam wynik z terminalem WSL (cokolwiek to jest).
Przestań krzywdzić Monikę