Version originale
Une façon de procéder consiste à obtenir le processus parent de votre session shell actuelle et à partir de là le nom du terminal.
-
Obtenir le parent du processus shell en cours. La variable bash $$
est le PID de votre shell actuel. Nous pouvons donc donner cela sous forme de requête à ps
( -p $$
) et lui demander d'imprimer le PID du processus parent ( -o ppid=
, le dernier point=
évite d’imprimer les en-têtes de colonnes):
$ ps -p $$ -o ppid=
544
Ainsi, le PID du parent de mon shell est 544
.
-
Obtenez le processus associé à ce PID et imprimez sa ligne de commande
$ ps -p 544 o args=
/usr/bin/python /usr/bin/terminator
La sortie ci-dessus dépendra de l'émulateur de terminal que vous utilisez. J'utilise terminator
.
-
Tout combiner en une seule commande
ps -p $(ps -p $$ -o ppid=) o args=
-
Utilisez-le pour obtenir la version
$(ps -p $(ps -p $$ -o ppid=) o args=) --version
terminator 0.97
-
Ajoutez une petite fonction à votre ~/.bashrc
qui renvoie le nom et la version de l'émulateur de terminal que vous utilisez (cela fonctionne pour les émulateurs de terminal les plus courants):
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}')
}
Vous pouvez maintenant obtenir le nom du terminal et également transmettre l’option de votre choix (telle que --version
.
Quelques exemples utilisant différents terminaux:
-
xterm
$ which_term
XTerm(297)
-
terminator
$ which_term
terminator 0.97
-
rxvt
, celui-ci ne contient aucun des indicateurs -V
, -version
ou --version
; aucune information sur la version n'est donc imprimée.
$ 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 <[email protected]>
and Nick Schermer <[email protected]>.
Please report bugs to <http://bugzilla.xfce.org/>.
Nouveau et amélioré
L’approche ci-dessus n’est cependant pas digne de confiance. Il s'étouffera lorsque vous exécuterez votre shell après su
ing avec un autre utilisateur ou lorsque votre terminal aura un alias avec quelque chose et divers autres cas. Puisque nous travaillons évidemment avec les programmes X ici, un meilleur moyen pourrait être d’utiliser quelque chose comme xdotool
(installable avec sudo apt-get install xdotool
) pour obtenir les informations à la place:
perl -lpe 's/$ which_term
lxterminal
/ /g' /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline
Ce qui précède imprimera la ligne de commande utilisée pour lancer la fenêtre actuellement active. Puisque votre terminal sera probablement actif, c'est la commande qu'il affichera. Cela signifie que pour la plupart des émulateurs de terminal, vous pouvez sans risque supposer que le premier champ renvoyé est le nom du terminal:
$ dpkg -l $(which_term) | awk '/^ii/{print $3}'
0.1.11-4
Cela signifie que l’obtention de la version est triviale. Par exemple
$ which_term
/usr/lib/gnome-terminal/gnome-terminal-server
Pas le cas pour gnome-terminal
:
$ which_term
/usr/bin/python /usr/bin/terminator
ou terminator
:
which_term(){
term=$(perl -lpe 's/$ ps -p $$ -o ppid=
544
/ /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"
}
Donc, nous pouvons le rendre un peu plus complexe (il y a quelques basismes ici, celui-ci n'est pas portable):
$ ps -p 544 o args=
/usr/bin/python /usr/bin/terminator
Cela fonctionne pour tous les cas sur lesquels j'ai testé.