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?
command-line
gnome-terminal
user4943481
quelle
quelle
Antworten:
TL; DR
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. Der Wert vonpid
später kann anps -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 :
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/passwd
für seinen Benutzernamen zugewiesen . Vorausgesetzt, Sie verwenden die Standardkonfiguration und haben keine andere Shell explizit als Befehl aufgerufen, ist Folgendes ausreichend:Dies zeigt aber natürlich nur den Standardwert . Angenommen, wir machen Folgendes:
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?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 tunVariation über das Thema könnte auch sein
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 tunBeide 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 inexecve()
syscall festgelegt. Dies wird in Woher weiß bash, wie es aufgerufen wird? Wenn Sie also eine Anwendung haben, über die eine Shell gestartet wirdexecve()
, 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 vonecho $TERM
oder gemeldet wirdecho $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:Versuchen wir es mit einer anderen Terminal-App
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 Elementbash -c '...'
oder die Shell über gestartetssh
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:Darüber hinaus sollten Fenstermanager gemäß den Spezifikationen
WM_CLASS
Eigenschaften festlegen . So können wir das auch bekommenxprop
: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 istxterm
.quelle
$SHELL
, na klarps | grep
?ps -p $$
! Oder nur für den Befehlps -p $$ -o cmd=
.ps | grep
ist einfach eine schlechte Form. Das meiste von dem, was Sie greifen können, kann tatsächlich von sichps
selbst oder mit anderen Werkzeugen erhalten werden.Die Kurzversion (danke @Serg )
Die lange Version
und suche die
*
in der ausgabe;)
Beispielausgabe
Oder, dank @muru , hier ist eine detailliertere Ausgabe
quelle
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
oderupdate-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, anstattcat
es zu verwenden. Dasfile
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ürgnome-terminal
, Binärdateiurxvt
usw.).Wenn Sie wissen möchten, welches Terminalprogramm Sie verwenden, gehen Sie wie folgt vor:
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
) vonps -o 'ppid=' -p $$
, die die Prozess-ID des Terminalprogramms ist.Dann finden wir den Prozessnamen aus der PID:
Es ist im Grunde ein Einzeiler von:
quelle
sshd: username@pts/4
. Hinweis Ich verwende PuTTY, um eine Verbindung zum Gerät herzustellen. Ist dassshd
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 Terminalssakura
.Der unten stehende ist von einem
aterm
Terminal.quelle
Wenn Sie nur den Namen des Terminalprogramms möchten, finden Sie ihn höchstwahrscheinlich unter Hilfe> Info.
quelle
Beispielausgabe:
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.Quellen:
quelle
Einfache Antwort. Funktioniert sowohl für die Konsole als auch für ssh.
Beispiel für ein einfaches Zeichen-Terminal:
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)
bedeutet, dass Sie GUI-Befehle wie das Öffnen des Leafpad-Editors oder des Nautilus-Dateimanagers verwenden können.
Auf der Konsole ist es dasselbe:
quelle
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.