Czy istnieje możliwość uzyskania typu terminala za pomocą polecenia?
Jeśli używam gnome-terminal
, wyjście powinno być gnome-terminal
lub coś podobnego. Przydałaby się również wersja terminalu.
Aktualizacja
ps -aux | grep `ps -p $$ -o ppid=`
wyświetli coś takiego:
user 4239 0.0 0.7 292708 15744 pts/8 Sl 11:39 0:02 xfce4-terminal
user 4800 0.0 0.0 6176 820 pts/0 S+ 12:23 0:00 grep --color=auto 4239
Będzie to również działać z Xterm, ale jak uzyskać tylko nazwę ( xfce4-terminal
w tym przypadku)?
command-line
TuKsn
źródło
źródło
window 31457282 has no pid associated with it
(testowane na Lubuntu)Odpowiedzi:
Orginalna wersja
Jednym ze sposobów na to jest uzyskanie procesu nadrzędnego dla bieżącej sesji powłoki, a stamtąd nazwa terminala.
Uzyskaj element nadrzędny bieżącego procesu powłoki. Zmienna bash
$$
jest PID twojej bieżącej powłoki, więc możemy podać to jako zapytanie dops
(-p $$
) i poprosić go, aby wydrukował PID procesu nadrzędnego (-o ppid=
trailing=
ma na celu uniknięcie drukowania nagłówków kolumn):Tak więc PID rodzica mojej powłoki to
544
.Pobierz proces powiązany z tym PID i wydrukuj jego wiersz poleceń
Powyższe dane wyjściowe będą zależeć od używanego emulatora terminala, którego używam
terminator
.Połącz wszystko w jednym poleceniu
Użyj tego, aby uzyskać wersję
Dodaj do swojej funkcji małą funkcję,
~/.bashrc
która zwraca nazwę i wersję używanego emulatora terminala (działa to w przypadku większości popularnych emulatorów terminali):Możesz teraz uzyskać nazwę terminala, a także przekazać dowolną opcję, którą lubisz (np
--version
.Niektóre przykłady z wykorzystaniem różnych terminali:
xterm
terminator
rxvt
Ten jeden ma żaden z-V
,-version
lub--version
flagi więc nie ma informacji wersja zostanie wydrukowany.gnome-terminal
.konsole
lxterminal
xfce4-terminal
Nowe i ulepszone
Powyższe podejście nie jest jednak tak godne zaufania. Dusi się, gdy uruchomisz powłokę po
su
wysłaniu wiadomości do innego użytkownika lub gdy twój terminal jest aliasowany do czegoś i różnych innych przypadków. Ponieważ oczywiście pracujemy tutaj z programami X, lepszym sposobem może być użycie czegoś takiegoxdotool
(instalowanego zsudo apt-get install xdotool
), aby uzyskać informacje:Powyżej wydrukuje wiersz poleceń użyty do uruchomienia aktualnie aktywnego okna. Ponieważ twój terminal prawdopodobnie będzie aktywny, to polecenie, które pokaże. Oznacza to, że w przypadku większości emulatorów terminali można bezpiecznie założyć, że zwrócone 1. pole to nazwa terminala:
Oznacza to, że uzyskanie wersji jest banalne. Na przykład
Nie dotyczy to
gnome-terminal
:lub
terminator
:Możemy więc uczynić to nieco bardziej złożonym (tutaj są pewne bashizmy, ten nie jest przenośny):
Działa to we wszystkich przypadkach, w których testowałem.
źródło
$PPID
aby uzyskać PID procesu nadrzędnego.ksh
lubtcsh
. Jest to jednak bardzo dobry pomysł dla rodziny bash, ponieważ jest to znacznie prostsze niż moje podejście.ksh93
imksh
.Spróbuj tego,
LUB
źródło
rxvt
aterminator
drugi zawiedzieuxterm
ignome-terminal
(drukuje/usr/lib/gnome-terminal/gnome-terminal-server
). Wszystkie zawiodą (podobnie jak moje), jeśli używasz sesji su.$PPID
jest PID procesu macierzystego powłoki.comm
oznacza polecenie . Może to być pełna ścieżka, alebasename
w razie potrzeby używamy jej do usuwania.Ostrzeżenia
Prawdopodobnie dotyczą one przynajmniej niektórych innych odpowiedzi.
comm
jest technicznieargv[0]
, co w rzeczywistości może być dowolnym ciągiem. Ale ogólnie powinieneś być w stanie polegać na tym w tym konkretnym przypadku.To nie będzie działać, jeśli połączyć się przez SSH lub wykorzystania zgodnie z oczekiwaniami
tmux
,screen
lub coś podobnego.źródło
termin
jako wynik.$PPID
nie jest to standard we wszystkich powłokach. np.tcsh
dostaję:PPID: Undefined variable.
Możesz spróbować wykonać następujące polecenie:Aktualizacja (dzięki OP i Avinash Raj):
źródło
gnome-terminal 3.6.2-0ubuntu1l
do Xterm?Inną (nie idealną) możliwością jest:
Ale to nie działa z lxterminal, ponieważ zmienna środowiskowa jest
$WINDOWID
pusta ...Terminator pokazuje nazwę „x-terminal-emulator”.
źródło
Bieżący terminal można również wykryć za pomocą sekwencji ucieczki: Atrybuty urządzenia (drugorzędne DA)
Na przykład w bash:
Zwraca tylko jakiś identyfikator - i niestety nie znam oficjalnej listy, która tłumaczy je na rzeczywiste nazwy.
Aby zobaczyć prawdziwą implementację, która tłumaczy niektóre znane identyfikatory na nazwy terminali, zobacz ten przykładowy skrypt bash: https://github.com/mintty/utils/blob/master/terminal
źródło