Version originale
Pour ce faire, vous pouvez obtenir le processus parent de votre session shell actuelle et à partir de là le nom du terminal.
Récupère le parent du processus shell actuel. La variable bash $$
est le PID de votre shell actuel, nous pouvons donc donner cela en tant que requête à ps
( -p $$
) et lui demander d'imprimer le PID du processus parent ( -o ppid=
, la fin =
est d'éviter d'imprimer les en-têtes de colonne):
$ 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
.
Combinez tout 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 retourne 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 lui transmettre également toutes les options que vous souhaitez (telles que --version
.
Quelques exemples utilisant différents terminaux:
xterm
$ which_term
XTerm(297)
terminator
$ which_term
terminator 0.97
rxvt
, celui-ci n'a aucun des drapeaux ou -V
, donc aucune information de version n'est imprimée.-version
--version
$ 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/>.
Nouveau et amélioré
L'approche ci-dessus n'est cependant pas digne de confiance. Il s'étouffera lorsque vous exécutez votre shell après avoir su
consulté un autre utilisateur ou lorsque votre terminal est associé à quelque chose et à divers autres cas. Comme nous travaillons évidemment avec des programmes X ici, une meilleure façon pourrait être d'utiliser quelque chose comme xdotool
(installable avec sudo apt-get install xdotool
) pour obtenir les informations à la place:
perl -lpe 's/\0/ /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. Étant donné que votre terminal sera probablement actif, c'est la commande qu'il affichera. Cela signifie que pour la plupart des émulateurs de terminaux, vous pouvez supposer en toute sécurité que le 1er champ renvoyé est le nom du terminal:
$ which_term
lxterminal
Cela signifie que l'obtention de la version est triviale. Par exemple
$ dpkg -l $(which_term) | awk '/^ii/{print $3}'
0.1.11-4
Ce n'est pas le cas pour gnome-terminal
:
$ which_term
/usr/lib/gnome-terminal/gnome-terminal-server
ou terminator
:
$ which_term
/usr/bin/python /usr/bin/terminator
Donc, nous pouvons le rendre un peu plus complexe (il y a des bashismes ici, celui-ci n'est pas portable):
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"
}
Cela fonctionne pour tous les cas sur lesquels j'ai testé.