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 $TERM
wartość zostanie ustawiona na linux
.
Motywuję, aby zapytać, że w moim ~/.bashrc
pliku 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 TERM
należ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-color
na początku mojego ~/.bashrc
pliku, 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).
Odpowiedzi:
W wielu miejscach, w zależności
W terminalach wirtualnych i rzeczywistych
TERM
zmienna środowiskowa jest ustawiana przez program, którylogin
łą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
getty
program jest wywoływany z argumentem określającym typ terminala lub jest przekazywany doTERM
programu z danych konfiguracyjnych usługi menedżera usług.init
systemach van Smoorenburga można to zobaczyć we/etc/inittab
wpisach, które przeczytają coś podobnego do Ostatnim argumentemagetty
w tym wierszuvt100-nav
jest ustawiony typ terminala/dev/ttyS0
. Więc/etc/inittab
gdzie zmienić typ terminala dla prawdziwych terminali w takich systemach./usr/lib/systemd/system/[email protected]
pliku jednostki (/lib/systemd/system/[email protected]
w systemach niepołączonych ), który czyta ustawienieTERM
zmiennej w przekazanym środowiskuagetty
. 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).init
pobiera typ terminala z trzeciego pola wpisu każdego terminala w/etc/ttys
bazie danych i ustawiaTERM
z tego w środowisku, w którym wykonujegetty
. Tak więc/etc/ttys
zmienia 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
linux
do bazy danych terminfo. (Emulacja terminala jądra FreeBSD jest ograniczonymxterm
podzbiorem od wersji 9.)mingetty
lubvc-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./usr/lib/systemd/system/[email protected]
pliku jednostki (/lib/systemd/system/[email protected]
w systemach niepołączonych ), który czyta ustawienieTERM
zmiennej w przekazanym środowiskuagetty
.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
linux
sekwencje CSI wysłane przez emulator terminala Linux Kernel różnią się odxterm
lubvt100
sekwencji 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 zeTERM
zmienną, 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.
Dalsza lektura
TERM
. Przewodnik nosh . Oprogramowania.źródło
[ -x /usr/bin/tput ] && /usr/bin/tput setaf 1 >&/dev/null && color_prompt=yes
. (ncurses 5.9)tput Co
Zwraca także „nieznane możliwości terminfo” w Jessie i Xenial.tput colors
itput setaf 1
oba wydają się działać, chociaż przyznaję, że nie rozumiem dlaczego .Proszę zobaczyć /ubuntu//a/614714/398785 dla mojej szczegółowej odpowiedzi na pytanie, dlaczego uważam, że
TERM=xterm-color
jest to niewłaściwe podejście, a system Ubuntu.bashrc
jest przestarzały. Zalecam skorzystanie zTERM=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
.źródło
.bashrc
jest przestarzałe). „Plik .bashrc Ubuntu jest przestarzały.”xterm-256color
przyczynyhtop
bałagan jego układ jak ten w Ubuntu 18.04.