Jak sprawdzić, którego terminala używam?


23

Mam Ubuntu na moim komputerze i działam na nim niesamowity menedżer okien. Jak sprawdzić, który terminal używam? Czy jest na to polecenie?


5
co masz na myśli przez które ? Kliknij Pomoc -> O to chodzi?
JoKeR,

3
Który terminal oznacza program terminala lub powłokę?
heemayl

Odpowiedzi:


24

TL; DR

  • znaleźć aktualnie uruchomione użycie powłoki ls -l /proc/$$/exe
  • aby znaleźć aktualnie działający terminal, użyj xprop _NET_WM_PID WM_CLASS. Wartość pidpóźniej można przekazać do ps -p <pid> -o argspolecenia.
  • Technicznie rzecz biorąc, dla emulatora terminala nie potrzebujesz nawet polecenia, jak stwierdzono w komentarzach :

    co przez to rozumiesz? Kliknij Pomoc -> O to chodzi? - JoKeR

Shell vs Terminal

Pierwszą rzeczą, którą musimy wyjaśnić, jest dokładnie to, o co pytamy - znajdź działającą powłokę lub działający terminal. Często te dwa terminy są używane zamiennie, ale są to zupełnie różne rzeczy. Shell to interpreter wiersza poleceń, w szczególności interaktywna powłoka to pole zachęty plus pole tekstowe, w którym wpisujesz polecenia. Powłoki mogą być również nieinteraktywne, na przykład skrypt uruchamia powłokę nieinteraktywną lub bash -c 'echo hello world'również powłokę nieinteraktywną.

Natomiast terminal jest interfejsem do powłoki (choć może to być także inna aplikacja). Początkowo terminale odnosiły się do rzeczywistego sprzętu, ale obecnie są to głównie oprogramowanie. To, co widzisz po naciśnięciu Ctrl+ Alt+ tlub kliknięciu ikony terminala w graficznym interfejsie użytkownika, uruchamia emulator terminala, okno naśladujące zachowanie sprzętu, aw tym oknie możesz zobaczyć działającą powłokę. Ctrl+ Alt+ F2(lub dowolny z 6 klawiszy funkcyjnych) otworzy konsolę wirtualną, alias tty. Polecam lekturę Dlaczego terminal wirtualny jest „wirtualny” i co / dlaczego / gdzie jest „prawdziwy” terminal? aby uzyskać więcej informacji na temat szczegółów.

Uzyskiwanie informacji o powłoce

Każdy użytkownik ma przypisaną domyślną powłokę /etc/passwddla swojej nazwy użytkownika. Zakładając, że używasz domyślnej konfiguracji i nie wywołałeś jawnie innej powłoki jako polecenia, wystarczy:

echo $SHELL

Ale oczywiście pokazuje to tylko wartość domyślną . Załóżmy, że wykonujemy następujące czynności:

user@ubuntu:~$ dash
$

Byliśmy w oryginalnie bash, ale zaczął interaktywną sesję /bin/dash, Ubuntu POSIX lub powłoki systemu . Zmienna $SHELLsię nie zmieni, ponieważ to nie jest jej cel - pokazuje domyślną, a nie bieżącą wartość. Będziemy musieli podejść do tego z innej perspektywy - z perspektywy procesu, który jest czymś, co omówiłem. Czy używam bash czy sh?

$ echo $$
4824
$ cat /proc/4824/comm                                                          
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash

Tutaj korzystamy z /proc/systemu plików. Nazwa procesu i parametry wiersza polecenia są wyświetlane w /proc/<pid>/comm. Wszystko, czego potrzebujemy, to podać PID powłoki, co właśnie $$robi. W powyższym przykładzie dodaję to osobno, ale nic nie powstrzymuje nas przed zrobieniem sprawiedliwego

cat /proc/$$/comm

Wariacja na temat może być również

ps -p $$ -o args

Innym sposobem, w jaki możemy do tego podejść, jest sprawdzenie gdzie /proc/<pid>/exe. Ten plik jest dowiązaniem symbolicznym wskazującym plik wykonywalny. W ten sposób możemy to zrobić

user@ubuntu:~$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr  4 18:20 /proc/1241/exe -> /bin/bash
user@ubuntu:~$ sh
$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr  4 18:20 /proc/1255/exe -> /bin/dash

Każde z tych dwóch podejść działa w 99% przypadków. Oczywiście są sposoby, w jakie można je obalić. Na przykład, dowiązanie nie wskaże w dowolnym miejscu, jeśli program został usunięty zaraz po uruchomieniu powłoki (w takim przypadku prawdopodobnie napotka problemy systemowe, ponieważ usunięcie /bin/sh, /bin/dashlub nawet /bin/bashnie jest zalecane - w końcu wiele skryptów na nich polegać , szczególnie na poziomie systemu). Nazwa polecenia powłoki jest zwykle ustawiana jako pierwszy argument w execve()syscall. Jest to omówione w Skąd bash wie, w jaki sposób jest wywoływany? , więc jeśli masz aplikację, która uruchamia powłokę przez execve(), może nadać jej dowolną nazwę. Są to jednak rzeczy niestandardowe i nietypowe, których należy unikać ze względu na spójność i bezpieczeństwo.


Uzyskiwanie informacji o terminalu

Możemy zacząć od zmiennych środowiskowych. Wiele terminali wydaje się maskować jako „ xtermkompatybilne”, o czym informuje echo $TERMlub echo $COLORTERM. Ale wtedy zmienne środowiskowe nie są bardzo niezawodnym narzędziem. Można je ustawić i rozbroić. Możemy zrobić to samo z PID-ami, tyle że tym razem przyjrzymy się nadrzędnemu PID-owi. Jak zapewne pamiętasz, terminal jest interfejsem powłoki i często uruchamia samą powłokę. Dlatego możemy dowiedzieć się, który proces jest procesem nadrzędnym naszej powłoki:

$ ps -p $$ -o args,ppid
COMMAND                      PPID
bash                         1234
$ ps -p 1234 -o args
COMMAND
/usr/lib/gnome-terminal/gnome-terminal-server

Spróbujmy z inną aplikacją terminalową sakura:

$ ps -p $$ -o args,ppid
COMMAND                      PPID
/bin/bash                   16950
$ ps -p 16950 -o args
COMMAND
sakura

Stamtąd możemy już zobaczyć, że to, co uruchomiło tę powłokę, jest gnome-terminal. Ta metoda oczywiście działa przy założeniu, że pracujesz z interaktywną powłoką. Jeśli próbujemy dowiedzieć się, czy element nadrzędny bash -c '...'lub powłoka została uruchomiona za pomocą ssh, na przykład, PID może bardzo dobrze pochodzić z aplikacji nieterminalnej i być może nie z GUI.

Jeśli więc chcemy konkretnie zająć się terminalem GUI, możemy uruchomić xprop, kliknąć żądane okno, grep jego pid i dowiedzieć się, jak nazywa się ten proces pasujący do pid. Lub innymi słowy:

$ ps aux | grep $(xprop | awk -F'='  '/PID/ {print $2}')                       
xieerqi   2124  0.6  1.7 208068 34604 ?        Sl   18:47   1:49 gnome-terminal

Dodatkowo, zgodnie ze specyfikacjami , menedżerowie okien powinni ustawić WM_CLASSwłaściwość. W ten sposób możemy to również uzyskać xprop:

$ xprop WM_CLASS 
WM_CLASS(STRING) = "sakura", "Sakura"

Oczywiście ma to również 1% wad: ustawianie WM_CLASSwłaściwości zależy od tego, czy menedżer okien to robi, a PID nie gwarantuje dokładności okna (patrz Jaki proces utworzył to okno X11? ), Co może wymagać złożonego debugowania. I to nie są wady samych metod, ale serwera X11. Jednak najbardziej stabilne i dobrze znane menedżery okien (takie jak openbox, Metacity, blackbox) i większość aplikacji są dobrze obsługiwane, więc nie powinniśmy spodziewać się problemów z czymś takim jak Gnome Terminal lub Terminator.

Ale jeśli chodzi o emulatory terminali GUI, nie musimy nawet znajdować polecenia. Możemy po prostu użyć Aboutokna dialogowego samego okna. Wyjątkiem jest ta reguła xterm.


O_o $SHELL, na pewno
AB

Eek. Dlaczego wy ludzie używacie ps | grep? ps -p $$! Albo, po prostu dla komendy ps -p $$ -o cmd=.
muru

@muru, ponieważ jestem mniej doświadczonym użytkownikiem niż ty i nie mam zapamiętanych wszystkich flag ps> _ <tępo
Sergiy Kolodyazhnyy

2
Ja też nie, ale ps | grepto po prostu zła forma. Większość tego, co można grepować, można faktycznie uzyskać pssamodzielnie lub za pomocą innych narzędzi.
muru

UWAGA: Zaktualizowałem moją odpowiedź, ponieważ to pytanie było pierwotnie niejasne, a niektóre jego części wymagają nieco tła; z czasem odkryłem też, że istnieją lepsze sposoby wywoływania poleceń.
Sergiy Kolodyazhnyy

12

Krótka wersja (thx @Serg )

cat /etc/alternatives/x-terminal-emulator

Długa wersja

sudo update-alternatives --config x-terminal-emulator

i poszukaj *w danych wyjściowych

;)


Przykładowe dane wyjściowe

There are 7 alternatives which provide `x-terminal-emulator’.
Wybór alternatywy
———————————————–
    1 / usr / bin / xterm
    2 / usr / bin / uxterm
    3 / usr / bin / koi8rxterm
    4 / usr / bin / lxterm
 * + 5 /usr/bin/gnome-terminal.wrapper
    6 / usr / bin / konsole
    7 /usr/bin/xfce4-terminal.wrapper
Press enter to keep the default[*], or type selection number:

Lub, dzięki @muru , tutaj jest bardziej szczegółowy wynik

$ update-alternatives --display x-terminal-emulator
x-terminal-emulator - auto mode
  link currently points to /usr/bin/gnome-terminal.wrapper
/usr/bin/gnome-terminal.wrapper - priority 40
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/gnome-terminal.1.gz
/usr/bin/koi8rxterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/koi8rxterm.1.gz
/usr/bin/lxterm - priority 30
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/lxterm.1.gz
/usr/bin/mate-terminal.wrapper - priority 30
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/mate-terminal.1.gz
/usr/bin/uxterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/uxterm.1.gz
/usr/bin/xterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/xterm.1.gz
Current 'best' version is '/usr/bin/gnome-terminal.wrapper'.

2
cat /etc/alternatives/x-terminal-emulator | grep exec
Sergiy Kolodyazhnyy

Czy muszę zainstalować narzędzie? I dostać albo Binary file (standard input) matchesczy update-alternatives: error: unknown argument -config'`
Terrance

Nieważne, to jest--config
Terrance

1
Nie trzeba sudo. Użyjupdate-alternatives --display x-terminal-emulator
muru

W przypadku krótkiej wersji można rozważyć użycie file /etc/alternatives/x-terminal-emulatorcelu uzyskania tego linku symbolicznego zamiast użycia catgo. fileNarzędzie powinno być zainstalowane na większości systemów i mogą być wykorzystywane w celu znalezienia pliku wykonywalnego docelowej. catna dowiązaniu symbolicznym można wydrukować dowolny skrypt powłoki, a nawet plik binarny, w zależności od celu tego łącza (skrypt powłoki gnome-terminal, plik binarny urxvtitp.).
chris544

9

Jeśli chcesz poznać program terminalowy, którego używasz, użyj tego:

ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)

Uruchom to zaraz po otwarciu terminala (powłoki), bez tworzenia kolejnych wystąpień powłoki .

Kiedy otworzysz program terminalowy, po prostu spawnuje program potomny, powłokę. Zatem rodzicem spawnowanej powłoki jest sam terminal. Innymi słowy, PPID powłoki jest PID programu terminalowego.

Znajdujemy tutaj nadrzędny identyfikator procesu (PPID) powłoki ( bash) ps -o 'ppid=' -p $$, który będzie identyfikatorem procesu programu terminalowego.

Następnie znajdujemy nazwę procesu z PID:

$ ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
gnome-terminal

Jest to w zasadzie jeden wkład:

$ ps -o 'ppid=' -p $$
 2268

$ ps -o 'cmd=' -p 2268
gnome-terminal

1
Kiedy uruchamiam to polecenie, otrzymuję sshd: username@pts/4. Uwaga Używam PuTTY do połączenia z maszyną. Czy w sshdrzeczywistości jest emulator terminala?
user3731622

3

Wpisz w printenvoknie terminala, aby wyświetlić wszystkie zmienne otwartej sesji.

Wpisz w echo $COLORTERMoknie terminala. UWAGA: to nie działa ze wszystkimi terminalami, jeden podobny sakuranie zgłasza tego z powrotem.

root@terrance-Linux:~# echo $COLORTERM
gnome-terminal

ten poniżej pochodzi z atermterminala.

root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm

echo $ COLORTERM w sakura zgłasza puste
Sergiy Kolodyazhnyy

@Serg dziękuję. Wygląda na to, że jest to wariant xtermu.
Terrance

@Erg tylko zastanawiasz się, czy lubisz Sakurę? Co cię do tego pociąga?
Terrance

Jest w porządku, nic specjalnego, bardzo uproszczonego. Próbowałem różnych emulatorów terminali: terminator, roxterm, tylda, rozwijany (zapomniałem, jak to się nazywa, coś zaczynającego się na R). Myślę, że to kompromis między Xtermem a terminalem gnome
Sergiy Kolodyazhnyy

@Serg Ah, to dobrze wiedzieć. Sprawdzę to. :-) Zawsze szukam dobrego terminala, który działa z moim skryptem keepalive, który wysyła do nich klucze xdotool.
Terrance

3

Jeśli chcesz tylko nazwę programu terminalowego, najprawdopodobniej znajdziesz ją w Pomoc> Informacje.


0
cat /etc/alternatives/x-terminal-emulator | grep exec

Przykładowe dane wyjściowe:

exec ('gnome-terminal', @ args);

Istnieje odpowiedź dla mojego systemu: terminal gnome .

Więc wpisanie gnome-terminalw moim terminalu otworzy teraz kolejne identyczne okno terminalu.

Źródła:


-1

Prosta odpowiedź. Działa zarówno z konsolą, jak i ssh.

Przykład prostego terminala znakowego:

ssh username@systemname
echo $TERM
dumb

informuje, że nie można otwierać aplikacji GUI dla tego połączenia

Przykład dla xterm (działa również z PuTTY / Xming w systemie Windows)

ssh -Y username@systemname      -- omit this if using PuTTY --
echo $TERM
xterm

oznacza, że ​​możesz używać poleceń GUI, takich jak otwieranie edytora leafpad lub menedżera plików nautilus.

Na konsoli jest tak samo:

Open terminal window
echo $TERM
xterm

TERMnie jest zmienną definiującą domyślny emulator terminala, lecz raczej zmienną, która określa możliwości bieżącego. Na przykład ustawienie zmiennej na „xterm-color” pozwala każdemu programowi uruchomionemu w terminalu wiedzieć, że bieżący terminal ma rozumieć kolory; ustawienie na „linux” mówi programom, że to ma być VT; itp.
Cyboliczny
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.