
Ich habe versucht, pstree
den 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-terminal
aber xterm
nicht 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 screen
undtmux
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-utmp
von 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