Wie überprüfe ich, welches Terminal ich benutze?

23

Ich habe Ubuntu auf meinem Rechner und ich starte einen fantastischen Fenstermanager. Wie überprüfe ich, welches Terminal ich betreibe? Gibt es einen Befehl dafür?

user4943481
quelle
5
was meinst du mit denen ? Klicken Sie auf Hilfe -> Über ist es das?
JoKeR
3
Welches Terminal bedeutet das Terminalprogramm oder die Shell?
Heemayl

Antworten:

23

TL; DR

  • um die aktuell laufende Shell zu finden ls -l /proc/$$/exe
  • Um das aktuell laufende Terminal zu finden, verwenden Sie xprop _NET_WM_PID WM_CLASS. Der Wert von pidspäter kann an ps -p <pid> -o argscommand übergeben werden.
  • Technisch gesehen benötigen Sie für den Terminalemulator nicht einmal einen Befehl, wie in den Kommentaren angegeben :

    was meinst du mit was Klicken Sie auf Hilfe -> Über ist es das? - JoKeR

Shell gegen Terminal

Als Erstes müssen wir klären, was genau gefragt wird - finden Sie die laufende Shell oder das laufende Terminal heraus. Oft werden diese beiden Begriffe synonym verwendet, aber es handelt sich um verschiedene Dinge. Shell ist der Befehlszeileninterpreter. Speziell die interaktive Shell ist das Eingabeaufforderungs- und Textfeld, in das Sie Befehle eingeben. Shells können auch nicht interaktiv sein. Beispielsweise startet ein Skript eine nicht interaktive Shell oder bash -c 'echo hello world'startet auch eine nicht interaktive Shell.

Im Gegensatz dazu ist Terminal die Schnittstelle zur Shell (obwohl es auch eine andere Anwendung sein könnte). Ursprünglich bezog sich das Terminal auf die eigentliche Hardware, heute handelt es sich jedoch hauptsächlich um Software. Was Sie sehen, wenn Sie Ctrl+ Alt+ drücken toder auf das Terminal-Symbol in der GUI klicken, das einen Terminal-Emulator startet, ein Fenster, das das Verhalten der Hardware nachahmt, und in diesem Fenster können Sie sehen, wie die Shell ausgeführt wird. Ctrl+ Alt+ F2(Oder eine der sechs Funktionstasten) werden virtuelle Konsole öffnen, aka tty. Ich empfehle zu lesen Warum ist ein virtuelles Terminal "virtuell" und was / warum / wo ist das "reale" Terminal? Für weitere Informationen über die Besonderheiten.

Shell-Informationen abrufen

Jedem Benutzer ist eine Standard-Shell /etc/passwdfür seinen Benutzernamen zugewiesen . Vorausgesetzt, Sie verwenden die Standardkonfiguration und haben keine andere Shell explizit als Befehl aufgerufen, ist Folgendes ausreichend:

echo $SHELL

Dies zeigt aber natürlich nur den Standardwert . Angenommen, wir machen Folgendes:

user@ubuntu:~$ dash
$

Wir waren ursprünglich in bash, begann aber interaktive Sitzung /bin/dash, Ubuntus POSIX oder System - Shell . Die Variable $SHELLändert sich nicht, da dies nicht ihrem Zweck entspricht - sie zeigt standardmäßig nicht den aktuellen Wert an. Wir müssen uns dem aus einer anderen Perspektive nähern - der Perspektive eines Prozesses, auf den ich eingegangen bin. Benutze ich bash oder sh?

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

Hier nutzen wir das /proc/Dateisystem. Der Name des Prozesses und die Befehlszeilenparameter werden in angezeigt /proc/<pid>/comm. Wir müssen nur die PID der Shell bereitstellen, was auch $$funktioniert. Im obigen Beispiel füge ich das separat hinzu, aber nichts hindert uns daran, es nur zu tun

cat /proc/$$/comm

Variation über das Thema könnte auch sein

ps -p $$ -o args

Eine andere Möglichkeit, dies zu erreichen, besteht darin, zu überprüfen, wo /proc/<pid>/exe. Diese Datei ist ein Symlink, der auf die ausführbare Datei verweist. So können wir es tun

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

Beide Ansätze funktionieren in 99% der Fälle. Natürlich gibt es Möglichkeiten, wie sie untergraben werden können. Zum Beispiel Symlink nicht überall zeigen , wenn die ausführbare Datei wurde kurz gelöscht , nachdem die Schale (und in diesem Fall gestartet wahrscheinlich werden Sie System Probleme auftreten, da das Entfernen /bin/sh, /bin/dashoder gar /bin/bashnicht zu empfehlen ist - schließlich viele Skripte auf sie verlassen insbesondere auf Systemebene). Der Befehlsname für die Shell wird normalerweise als erstes Argument in execve()syscall festgelegt. Dies wird in Woher weiß bash, wie es aufgerufen wird? Wenn Sie also eine Anwendung haben, über die eine Shell gestartet wird execve(), kann sie einen beliebigen Namen erhalten. Dies sind jedoch ungewöhnliche und untypische Dinge, die aus Gründen der Beständigkeit und Sicherheit vermieden werden sollten.


Terminalinformationen abrufen

Wir können mit den Umgebungsvariablen beginnen. Viele Terminals scheinen sich als xterm-kompatibel zu tarnen, was von echo $TERModer gemeldet wird echo $COLORTERM. Aber dann sind Umgebungsvariablen kein sehr zuverlässiges Werkzeug. Sie können gesetzt und nicht gesetzt werden. Wir können dasselbe mit PIDs wiederholen, außer dass wir uns diesmal die übergeordnete PID ansehen. Wie Sie sich vielleicht erinnern, ist Terminal die Schnittstelle zur Shell und startet häufig die Shell selbst. Daher können wir herausfinden, welcher Prozess der übergeordnete Prozess unserer Shell ist:

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

Versuchen wir es mit einer anderen Terminal-App sakura:

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

Von dort können wir bereits sehen, was diese Shell begonnen hat gnome-terminal. Diese Methode funktioniert natürlich unter der Annahme, dass Sie mit einer interaktiven Shell arbeiten. Wenn wir zum Beispiel herausfinden möchten, ob das übergeordnete Element bash -c '...'oder die Shell über gestartet sshwurde, stammt PID möglicherweise aus einer Nicht-Terminal-Anwendung und möglicherweise überhaupt nicht aus der GUI.

Wenn wir uns also speziell mit dem GUI-Terminal befassen möchten, können wir es ausführen xprop, auf das gewünschte Fenster klicken, dessen PID abrufen und herausfinden, wie der Name des Prozesses mit der PID übereinstimmt. Oder mit anderen Worten:

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

Darüber hinaus sollten Fenstermanager gemäß den SpezifikationenWM_CLASS Eigenschaften festlegen . So können wir das auch bekommen xprop:

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

Natürlich hat dies auch 1% der Nachteile: Das Festlegen von WM_CLASSEigenschaften hängt davon ab, dass der Fenstermanager dies ausführt, und es wird nicht garantiert, dass die PID für ein Fenster korrekt ist (siehe Welcher Prozess hat dieses X11-Fenster erstellt? ). Dies kann ein komplexes Debugging beinhalten. Und dies sind keine Mängel der Methoden selbst, sondern des X11-Servers. Die meisten stabilen und bekannten Fenstermanager (wie Openbox, Metacity, Blackbox) und die meisten Anwendungen verhalten sich jedoch gut, sodass wir keine Probleme mit so etwas wie Gnome Terminal oder Terminator erwarten sollten.

Aber wenn es um GUI-Terminalemulatoren geht, müssen wir nicht einmal einen Befehl finden. Wir können einfach den AboutDialog des Fensters selbst verwenden. Ausnahme von dieser Regel ist xterm.

Sergiy Kolodyazhnyy
quelle
O_o $SHELL, na klar
AB
Eek. Warum benutzt ihr Leute ps | grep? ps -p $$! Oder nur für den Befehl ps -p $$ -o cmd=.
muru
@muru, weil ich weniger erfahrene Benutzer bin als Sie, und ich habe nicht alle ps-Flags auswendig gelernt> _ <unverblümt
Sergiy Kolodyazhnyy
2
Ich auch nicht, aber es ps | grepist einfach eine schlechte Form. Das meiste von dem, was Sie greifen können, kann tatsächlich von sich psselbst oder mit anderen Werkzeugen erhalten werden.
muru
HINWEIS: Ich habe meine Antwort aktualisiert, da diese Frage ursprünglich unklar war und Teile davon Hintergrundinformationen erfordern. Mit der Zeit habe ich auch herausgefunden, dass es bessere Möglichkeiten gibt, Befehle aufzurufen.
Sergiy Kolodyazhnyy
12

Die Kurzversion (danke @Serg )

cat /etc/alternatives/x-terminal-emulator

Die lange Version

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

und suche die *in der ausgabe

;)


Beispielausgabe

There are 7 alternatives which provide `x-terminal-emulator’.
Auswahlalternative
———————————————–
    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:

Oder, dank @muru , hier ist eine detailliertere Ausgabe

$ 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'.
AB
quelle
2
cat /etc/alternatives/x-terminal-emulator | grep exec
Sergiy Kolodyazhnyy
Gibt es ein Dienstprogramm, das ich installiert haben muss? Ich bekomme entweder Binary file (standard input) matchesoder update-alternatives: error: unknown argument -config''
Terrance
Egal, es ist--config
Terrance
1
Das brauchst du nicht sudo. Verwenden Sieupdate-alternatives --display x-terminal-emulator
muru
Für die Kurzversion können Sie in Betracht ziehen file /etc/alternatives/x-terminal-emulator, das Ziel dieses symbolischen Links zu ermitteln, anstatt cates zu verwenden. Das fileDienstprogramm sollte auf den meisten Systemen installiert sein und kann verwendet werden, um die ausführbare Zieldatei zu finden. caton symbolic link kann je nach Ziel dieses Links ein beliebiges Shell-Skript oder sogar eine Binärdatei ausgeben (Shell-Skript für gnome-terminal, Binärdatei urxvtusw.).
Chris544
9

Wenn Sie wissen möchten, welches Terminalprogramm Sie verwenden, gehen Sie wie folgt vor:

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

Führen Sie dies direkt nach dem Öffnen des Terminals (Shell) aus, ohne eine weitere Shell-Instanz zu forken .

Wenn Sie das Terminalprogramm öffnen, wird im Grunde ein untergeordnetes Programm, eine Shell, erzeugt. Das übergeordnete Element der gespawnten Shell ist also das Terminal selbst. Mit anderen Worten, die PPID der Shell ist die PID des Terminalprogramms.

Hier finden wir die übergeordnete Prozess-ID (PPID) der shell ( bash) von ps -o 'ppid=' -p $$, die die Prozess-ID des Terminalprogramms ist.

Dann finden wir den Prozessnamen aus der PID:

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

Es ist im Grunde ein Einzeiler von:

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

$ ps -o 'cmd=' -p 2268
gnome-terminal
heemayl
quelle
1
Wenn ich diesen Befehl ausführe, bekomme ich sshd: username@pts/4. Hinweis Ich verwende PuTTY, um eine Verbindung zum Gerät herzustellen. Ist das sshdeigentlich der Terminal-Emulator?
user3731622
3

Geben Sie im printenvTerminalfenster ein, um alle Variablen der geöffneten Sitzung anzuzeigen.

Geben Sie im echo $COLORTERMTerminalfenster ein. HINWEIS: Dies funktioniert nicht bei allen Terminals sakura.

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

Der unten stehende ist von einem atermTerminal.

root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
Terrance
quelle
echo $ COLORTERM in Sakura-Berichten leer
Sergiy Kolodyazhnyy
@ Serg danke. Es sieht dann so aus, als wäre es eine Variante von xterm.
Terrance
@ Serg nur gefragt, ob Sie Sakura mögen? Und was reizt dich daran?
Terrance
Es ist in Ordnung, nichts Besonderes, ziemlich simpel. Ich habe verschiedene Terminal-Emulatoren ausprobiert: Terminator, Roxterm, Tilde, Dropdown (vergessen, wie es heißt, etwas beginnend mit R). Ich denke, es ist ein Kompromiss zwischen xterm und gnome-terminal
Sergiy Kolodyazhnyy
@ Serg Ah, das ist gut zu wissen. Ich werde das überprüfen. :-) Ich bin immer auf der Suche nach einem guten Terminal, das mit meinem Keepalive-Skript funktioniert, das ihnen xdotool-Schlüssel sendet.
Terrance
3

Wenn Sie nur den Namen des Terminalprogramms möchten, finden Sie ihn höchstwahrscheinlich unter Hilfe> Info.

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

Beispielausgabe:

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

Für mein System gibt es die Antwort: Gnome-Terminal .

Wenn Sie also gnome-terminalin mein Terminal tippen, wird ein weiteres identisches Terminalfenster geöffnet.

Quellen:

Gabriel Staples
quelle
-1

Einfache Antwort. Funktioniert sowohl für die Konsole als auch für ssh.

Beispiel für ein einfaches Zeichen-Terminal:

ssh username@systemname
echo $TERM
dumb

weist Sie darauf hin, dass Sie GUI-Apps für diese Verbindung nicht öffnen können

Beispiel für xterm (funktioniert auch mit PuTTY / Xming unter Windows)

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

bedeutet, dass Sie GUI-Befehle wie das Öffnen des Leafpad-Editors oder des Nautilus-Dateimanagers verwenden können.

Auf der Konsole ist es dasselbe:

Open terminal window
echo $TERM
xterm
SDsolar
quelle
TERMist keine Variable, die den Standard-Terminal-Emulator definiert, sondern eine, die die Funktionen des aktuellen definiert. Wenn Sie beispielsweise die Variable auf "xterm-color" setzen, weiß jedes Programm, das im Terminal ausgeführt wird, dass das aktuelle Terminal Farben verstehen soll. Wenn Sie es auf "linux" setzen, wird den Programmen mitgeteilt, dass dies eine VT sein soll. etc.
Cybolic