Versione originale
Un modo per farlo è ottenere il processo genitore della tua sessione di shell corrente e da lì il nome del terminale.
Ottieni il genitore dell'attuale processo di shell. La variabile bash $$è il PID della shell corrente, quindi possiamo fornirlo come query a ps( -p $$) e chiedergli di stampare il PID del processo parent ( -o ppid=il trailing =è quello di evitare la stampa delle intestazioni di colonna):
$ ps -p $$ -o ppid=
544
Quindi, il PID del genitore della mia shell è 544.
Ottieni il processo associato a quel PID e stampa la sua riga di comando
$ ps -p 544 o args=
/usr/bin/python /usr/bin/terminator
L'output sopra dipenderà dall'emulatore di terminale che stai usando, che sto usando terminator.
Combina tutto in un unico comando
ps -p $(ps -p $$ -o ppid=) o args=
Usalo per ottenere la versione
$(ps -p $(ps -p $$ -o ppid=) o args=) --version
terminator 0.97
Aggiungi una piccola funzione alla tua ~/.bashrcche restituisca il nome e la versione dell'emulatore di terminale che stai utilizzando (funziona per i più comuni emulatori di terminale):
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}')
}
Ora puoi ottenere il nome del terminale e passare anche qualsiasi opzione che ti piace (come --version.
Alcuni esempi usando terminali diversi:
xterm
$ which_term
XTerm(297)
terminator
$ which_term
terminator 0.97
rxvt, questo non ha nessuno dei flag o -V, quindi non viene stampata alcuna informazione sulla versione.-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/>.
Nuovo e migliorato
L'approccio di cui sopra non è poi così affidabile. Si strozzerà quando esegui la shell dopo aver eseguito l' suinstallazione su un altro utente o quando il tuo terminale è aliasato su qualcosa e vari altri casi. Dato che ovviamente stiamo lavorando con i programmi X qui, un modo migliore potrebbe essere quello di usare qualcosa come xdotool(installabile con sudo apt-get install xdotool) per ottenere le informazioni:
perl -lpe 's/\0/ /g' /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline
Quanto sopra stamperà la riga di comando utilizzata per avviare la finestra attualmente attiva. Poiché il tuo terminale sarà, presumibilmente, attivo, questo è il comando che mostrerà. Ciò significa che per la maggior parte degli emulatori di terminale, puoi tranquillamente supporre che il primo campo restituito sia il nome del terminale:
$ which_term
lxterminal
Ciò significa che ottenere la versione è banale. Per esempio
$ dpkg -l $(which_term) | awk '/^ii/{print $3}'
0.1.11-4
Non così per gnome-terminal:
$ which_term
/usr/lib/gnome-terminal/gnome-terminal-server
oppure terminator:
$ which_term
/usr/bin/python /usr/bin/terminator
Quindi, possiamo renderlo un po 'più complesso (ci sono alcuni bashismi qui, questo non è portatile):
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"
}
Questo funziona per tutti i casi su cui ho provato.