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?
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?
Antworten:
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. Der Wert von pid
später kann an ps -p <pid> -o args
command ü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
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.
Jedem Benutzer ist eine Standard-Shell /etc/passwd
fü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/dash
oder gar /bin/bash
nicht 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.
Wir können mit den Umgebungsvariablen beginnen. Viele Terminals scheinen sich als xterm
-kompatibel zu tarnen, was von echo $TERM
oder 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 ssh
wurde, 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_CLASS
Eigenschaften 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 About
Dialog des Fensters selbst verwenden. Ausnahme von dieser Regel ist xterm
.
$SHELL
, na klar
ps | grep
? ps -p $$
! Oder nur für den Befehl ps -p $$ -o cmd=
.
ps | grep
ist einfach eine schlechte Form. Das meiste von dem, was Sie greifen können, kann tatsächlich von sich ps
selbst oder mit anderen Werkzeugen erhalten werden.
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'.
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
oder update-alternatives: error: unknown argument
-config''
--config
sudo
. Verwenden Sieupdate-alternatives --display x-terminal-emulator
file /etc/alternatives/x-terminal-emulator
, das Ziel dieses symbolischen Links zu ermitteln, anstatt cat
es zu verwenden. Das file
Dienstprogramm sollte auf den meisten Systemen installiert sein und kann verwendet werden, um die ausführbare Zieldatei zu finden. cat
on 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 urxvt
usw.).
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
sshd: username@pts/4
. Hinweis Ich verwende PuTTY, um eine Verbindung zum Gerät herzustellen. Ist das sshd
eigentlich der Terminal-Emulator?
Geben Sie im printenv
Terminalfenster ein, um alle Variablen der geöffneten Sitzung anzuzeigen.
Geben Sie im echo $COLORTERM
Terminalfenster ein. HINWEIS: Dies funktioniert nicht bei allen Terminals sakura
.
root@terrance-Linux:~# echo $COLORTERM
gnome-terminal
Der unten stehende ist von einem aterm
Terminal.
root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
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-terminal
in mein Terminal tippen, wird ein weiteres identisches Terminalfenster geöffnet.
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
TERM
ist 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.