Originalfassung
Eine Möglichkeit, dies zu tun, besteht darin, den übergeordneten Prozess Ihrer aktuellen Shell-Sitzung und von dort den Namen des Terminals abzurufen.
Ruft das übergeordnete Element des aktuellen Shell-Prozesses ab. Die Bash-Variable $$
ist die PID Ihrer aktuellen Shell, daher können wir diese als Abfrage an ps
( -p $$
) senden und sie bitten, die PID des übergeordneten Prozesses zu drucken ( -o ppid=
das Nachstellen =
dient dazu, das Drucken von Spaltenüberschriften zu vermeiden):
$ ps -p $$ -o ppid=
544
Die PID des übergeordneten Elements meiner Shell lautet also 544
.
Rufen Sie den mit dieser PID verknüpften Prozess ab und drucken Sie seine Befehlszeile
$ ps -p 544 o args=
/usr/bin/python /usr/bin/terminator
Die obige Ausgabe hängt davon ab, welchen Terminalemulator Sie verwenden terminator
.
Kombinieren Sie alles in einem einzigen Befehl
ps -p $(ps -p $$ -o ppid=) o args=
Verwenden Sie das, um die Version zu erhalten
$(ps -p $(ps -p $$ -o ppid=) o args=) --version
terminator 0.97
Fügen Sie Ihrer eine kleine Funktion hinzu, die ~/.bashrc
den Namen und die Version des von Ihnen verwendeten Terminalemulators zurückgibt (dies funktioniert für die meisten gängigen Terminalemulatoren):
which_term(){
term=$(ps -p $(ps -p $$ -o ppid=) -o args=);
found=0;
case $term in
*gnome-terminal*)
found=1
echo "gnome-terminal " $(dpkg -l gnome-terminal | awk '/^ii/{print $3}')
;;
*lxterminal*)
found=1
echo "lxterminal " $(dpkg -l lxterminal | awk '/^ii/{print $3}')
;;
rxvt*)
found=1
echo "rxvt " $(dpkg -l rxvt | awk '/^ii/{print $3}')
;;
## Try and guess for any others
*)
for v in '-version' '--version' '-V' '-v'
do
$term "$v" &>/dev/null && eval $term $v && found=1 && break
done
;;
esac
## If none of the version arguments worked, try and get the
## package version
[ $found -eq 0 ] && echo "$term " $(dpkg -l $term | awk '/^ii/{print $3}')
}
Sie können nun den Namen des Terminals abrufen und ihm eine beliebige Option übergeben (z --version
. B..
Einige Beispiele mit verschiedenen Terminals:
xterm
$ which_term
XTerm(297)
terminator
$ which_term
terminator 0.97
rxvt
, dieses hat keine der -V
, -version
oder --version
Flags, so dass keine Versionsinformationen gedruckt werden.
$ which_term
rxvt 1:2.7.10-5
gnome-terminal
.
$ which_term
gnome-terminal 3.10.1-1
konsole
$ which_term
Qt: 4.8.6
KDE Development Platform: 4.11.3
Konsole: 2.11.3
lxterminal
$ which_term
lxterminal 0.1.11-4
xfce4-terminal
$ which_term
xfce4-terminal 0.6.2 (Xfce 4.10)
Copyright (c) 2003-2012
The Xfce development team. All rights reserved.
Written by Benedikt Meurer <benny@xfce.org>
and Nick Schermer <nick@xfce.org>.
Please report bugs to <http://bugzilla.xfce.org/>.
Neu und verbessert
Der obige Ansatz ist jedoch nicht so vertrauenswürdig. Es wird ersticken, wenn Sie Ihre Shell ausführen, nachdem su
Sie sie einem anderen Benutzer übergeben haben, oder wenn Ihr Terminal auf etwas und verschiedene andere Fälle ausgerichtet ist. Da wir hier offensichtlich mit X-Programmen arbeiten, besteht eine bessere Möglichkeit darin, stattdessen etwas wie xdotool
(installierbar mit sudo apt-get install xdotool
) zu verwenden, um die Informationen abzurufen:
perl -lpe 's/\0/ /g' /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline
Oben wird die Befehlszeile gedruckt, die zum Starten des aktuell aktiven Fensters verwendet wird. Da Ihr Terminal vermutlich aktiv sein wird, wird dieser Befehl angezeigt. Dies bedeutet, dass Sie bei den meisten Terminalemulatoren davon ausgehen können, dass das erste zurückgegebene Feld der Terminalname ist:
$ which_term
lxterminal
Dies bedeutet, dass das Abrufen der Version trivial ist. Beispielsweise
$ dpkg -l $(which_term) | awk '/^ii/{print $3}'
0.1.11-4
Nicht so für gnome-terminal
:
$ which_term
/usr/lib/gnome-terminal/gnome-terminal-server
oder terminator
:
$ which_term
/usr/bin/python /usr/bin/terminator
Also können wir es etwas komplexer machen (es gibt hier einige Bashismen, diese sind nicht portabel):
which_term(){
term=$(perl -lpe 's/\0/ /g' \
/proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline)
## Enable extended globbing patterns
shopt -s extglob
case $term in
## If this terminal is a python or perl program,
## then the emulator's name is likely the second
## part of it
*/python*|*/perl* )
term=$(basename "$(readlink -f $(echo "$term" | cut -d ' ' -f 2))")
version=$(dpkg -l "$term" | awk '/^ii/{print $3}')
;;
## The special case of gnome-terminal
*gnome-terminal-server* )
term="gnome-terminal"
;;
## For other cases, just take the 1st
## field of $term
* )
term=${term/% */}
;;
esac
version=$(dpkg -l "$term" | awk '/^ii/{print $3}')
echo "$term $version"
}
Dies funktioniert in allen Fällen, in denen ich getestet habe.