Holen Sie sich den Namen des Terminalemulators im Shell-Skript

Holen Sie sich den Namen des Terminalemulators im Shell-Skript

Ich habe versucht, pstreeden Namen des übergeordneten Emulators eines laufenden Shell-Skripts mithilfe von etwas Ähnlichem wie dem Folgenden zu finden:

pstree -s $PPID | awk -F '---' '{print $6}'

Dies funktioniert auf meinem aktuellen System. Ich habe es getestet , bin mir mate-terminalaber xtermnicht sicher, ob es auch auf anderen Linux-Systemen/-Plattformen und anderen Terminals funktioniert. Gibt es eine bessere/übersichtlichere (portablere) Möglichkeit, dies zu erreichen?

Antwort1

ps -o comm= -p "$(($(ps -o ppid= -p "$(($(ps -o sid= -p "$$")))")))"

Kann gute Ergebnisse liefern. Es gibt den Namen des Prozesses an, der dem Sitzungsleiter übergeordnet ist. Bei Prozessen, die innerhalb eines Terminalemulators gestartet werden, wäre das im Allgemeinen der Prozess, der diesen Terminalemulator ausführt (es sei denn, es werden Dinge wie screen, expect, tmux... verwendet (beachten Sie jedoch, dass screenundtmux SindTerminalemulatoren) oder neue Sitzungen werden explizit mit setsid, start-stop-daemon... gestartet)

Oder unterteilen Sie es mithilfe von Variablen in einzelne Schritte (was auch dazu beitragen kann, das Skript selbsterklärender zu machen):

sid=$(ps -o sid= -p "$$")
sid_as_integer=$((sid)) # strips blanks if any
session_leader_parent=$(ps -o ppid= -p "$sid_as_integer")
session_leader_parent_as_integer=$((session_leader_parent))
emulator=$(ps -o comm= -p "$session_leader_parent_as_integer")

Das Entfernen von Leerzeichen um Zahlen wird hier mithilfe $((...))der arithmetischen Erweiterung durchgeführt. Sie können dies auch mit dem Operator split+glob tun (unter der Annahme eines unveränderten $IFS) oder wie von @ack in Kommentaren vorgeschlagen mit xargs:

ps -o sid= -p "$$" |
  xargs ps -o ppid= -p |
  xargs ps -o comm= -p

Sie können auch versuchen, zu analysieren wtmp, wo Terminalemulatoren normalerweise einen Eintrag mit ihrer PID protokollieren, die dem Pseudoterminalgerät zugeordnet ist. Dies funktioniert bei mir auf einem Debian-System, sofern expect/screen/tmux... nicht beteiligt sind:

ps -o comm= -p "$(
  dump-utmp -r /var/log/wtmp |
  awk -v tty="$(ps -o tty= -p "$$")" -F ' *\\| *' '
    $2 == tty {print $5;exit}')"

(unter Verwendung dump-utmpvon GNU acct).

Antwort2

Um den Namen des von der aktuellen Shell verwendeten Terminalemulators herauszufinden, können Sie das X Window-System nach dem Namen des Fensters fragen, in dem die Shell aktuell sichtbar ist:

$ xwininfo -id $WINDOWID | awk '/^xwin/ { print $NF }'

"xterm"Dies gibt mir die Zeichenfolge in XTerm zurück , und "urxvt"wenn ich in Rxvt-Unicode ausführe. Das Ergebnis wird wahrscheinlich anders sein, wenn Sie die Gewohnheit haben, den Fenstertitel zu ändern, denn das ist es, was Ihnen hier zurückgegeben wird, denke ich.

Antwort3

Aufbauend aufStephane ChazelasLösung, um es unter tmux zum Laufen zu bringen (d. h. den Terminalemulator zurückzugeben, den der tmux-Client zur Anzeige verwendet), das scheint bei mir zu funktionieren:

TERMINAL_EMULATOR="$(ps --pid $(ps --pid $$ -o ppid=) -o comm=)"
if [[ "${TERMINAL_EMULATOR}" =~ tmux ]]; then
    export TERMINAL_EMULATOR=$(ps --pid "$(($(ps --pid $(ps --pid $(tmux display-message -p "#{client_pid}") -o sid=) -o ppid=)))" -o comm=)
else
    export TERMINAL_EMULATOR
fi

verwandte Informationen