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?
command-line
gnome-terminal
użytkownik4943481
źródło
źródło
Odpowiedzi:
TL; DR
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. Wartośćpid
później można przekazać dops -p <pid> -o args
polecenia.Technicznie rzecz biorąc, dla emulatora terminala nie potrzebujesz nawet polecenia, jak stwierdzono w komentarzach :
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/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:Ale oczywiście pokazuje to tylko wartość domyślną . Załóżmy, że wykonujemy następujące czynności:
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?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 sprawiedliwegoWariacja na temat może być również
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ć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 wexecve()
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ę przezexecve()
, 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 „
xterm
kompatybilne”, o czym informujeecho $TERM
lubecho $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:Spróbujmy z inną aplikacją terminalową
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ędnybash -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: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
: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łaxterm
.źródło
$SHELL
, na pewnops | grep
?ps -p $$
! Albo, po prostu dla komendyps -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 )
Długa wersja
i poszukaj
*
w danych wyjściowych;)
Przykładowe dane wyjściowe
Lub, dzięki @muru , tutaj jest bardziej szczegółowy wynik
źródło
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
czyupdate-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życiacat
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łokignome-terminal
, plik binarnyurxvt
itp.).Jeśli chcesz poznać program terminalowy, którego używasz, użyj tego:
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:
Jest to w zasadzie jeden wkład:
źródło
sshd: username@pts/4
. Uwaga Używam PuTTY do połączenia z maszyną. Czy wsshd
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 podobnysakura
nie zgłasza tego z powrotem.ten poniżej pochodzi z
aterm
terminala.źródło
Jeśli chcesz tylko nazwę programu terminalowego, najprawdopodobniej znajdziesz ją w Pomoc> Informacje.
źródło
Przykładowe dane wyjściowe:
Istnieje odpowiedź dla mojego systemu: terminal gnome .
Więc wpisanie
gnome-terminal
w moim terminalu otworzy teraz kolejne identyczne okno terminalu.Źródła:
źródło
Prosta odpowiedź. Działa zarówno z konsolą, jak i ssh.
Przykład prostego terminala znakowego:
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)
oznacza, że możesz używać poleceń GUI, takich jak otwieranie edytora leafpad lub menedżera plików nautilus.
Na konsoli jest tak samo:
źródło
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.