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?
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?
Odpowiedzi:
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. Wartość pid
później można przekazać do ps -p <pid> -o args
polecenia.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
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.
Każdy użytkownik ma przypisaną domyślną powłokę /etc/passwd
dla 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 $SHELL
się 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/dash
lub nawet /bin/bash
nie 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.
Możemy zacząć od zmiennych środowiskowych. Wiele terminali wydaje się maskować jako „ xterm
kompatybilne”, o czym informuje echo $TERM
lub 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_CLASS
wł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_CLASS
wł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ć About
okna dialogowego samego okna. Wyjątkiem jest ta reguła xterm
.
$SHELL
, na pewno
ps | grep
? ps -p $$
! Albo, po prostu dla komendy ps -p $$ -o cmd=
.
ps | grep
to po prostu zła forma. Większość tego, co można grepować, można faktycznie uzyskać ps
samodzielnie lub za pomocą innych narzędzi.
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'.
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
czy update-alternatives: error: unknown argument
-config'`
--config
sudo
. Użyjupdate-alternatives --display x-terminal-emulator
file /etc/alternatives/x-terminal-emulator
celu uzyskania tego linku symbolicznego zamiast użycia cat
go. file
Narzędzie powinno być zainstalowane na większości systemów i mogą być wykorzystywane w celu znalezienia pliku wykonywalnego docelowej. cat
na 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 urxvt
itp.).
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
sshd: username@pts/4
. Uwaga Używam PuTTY do połączenia z maszyną. Czy w sshd
rzeczywistości jest emulator terminala?
Wpisz w printenv
oknie terminala, aby wyświetlić wszystkie zmienne otwartej sesji.
Wpisz w echo $COLORTERM
oknie terminala. UWAGA: to nie działa ze wszystkimi terminalami, jeden podobny sakura
nie zgłasza tego z powrotem.
root@terrance-Linux:~# echo $COLORTERM
gnome-terminal
ten poniżej pochodzi z aterm
terminala.
root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
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-terminal
w moim terminalu otworzy teraz kolejne identyczne okno terminalu.
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
TERM
nie 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.