Versão original
Uma maneira de fazer isso é obter o processo pai de sua sessão atual do shell e, a partir daí, o nome do terminal.
-
Obtenha o pai do processo shell atual. A variável bash
$$
é o PID do seu shell atual, portanto, podemos fornecer isso como uma consulta paraps
(-p $$
) e solicitar que ele imprima o PID do processo pai (-o ppid=
, o% final)=
é evitar imprimir cabeçalhos de coluna):$ ps -p $$ -o ppid= 544
Portanto, o PID do pai do meu shell é
544
. -
Obtenha o processo associado a esse PID e imprima sua linha de comando
$ ps -p 544 o args= /usr/bin/python /usr/bin/terminator
A saída acima dependerá do emulador de terminal que você está usando, estou usando
terminator
. -
Combine tudo em um único comando
ps -p $(ps -p $$ -o ppid=) o args=
-
Use isso para obter a versão
$(ps -p $(ps -p $$ -o ppid=) o args=) --version terminator 0.97
-
Adicione uma pequena função ao seu
~/.bashrc
que retorna o nome e a versão do emulador de terminal que você está usando (isso funciona para a maioria dos emuladores de terminal comuns):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}') }
Agora você pode obter o nome do terminal e também passar qualquer opção que desejar (como
--version
.
Alguns exemplos usando terminais diferentes:
-
xterm
$ which_term XTerm(297)
-
terminator
$ which_term terminator 0.97
-
rxvt
, este não tem nenhum dos sinalizadores-V
,-version
ou--version
, portanto, nenhuma informação de versão é impressa.$ 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/>.
Novo e melhorado
A abordagem acima não é tão confiável. Ele irá sufocar quando você executar seu shell após su
ing para outro usuário ou quando seu terminal estiver com alias para algo e vários outros casos. Como obviamente estamos trabalhando com programas X aqui, uma maneira melhor seria usar algo como xdotool
(instalável com sudo apt-get install xdotool
) para obter as informações:
perl -lpe 's/$ which_term
lxterminal
/ /g' /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline
O texto acima imprimirá a linha de comando usada para iniciar a janela ativa no momento. Como o seu terminal, presumivelmente, estará ativo, esse é o comando que ele mostrará. Isto significa que para a maioria dos emuladores de terminal, você pode seguramente assumir que o primeiro campo retornado é o nome do terminal:
$ dpkg -l $(which_term) | awk '/^ii/{print $3}'
0.1.11-4
Isso significa que obter a versão é trivial. Por exemplo
$ which_term
/usr/lib/gnome-terminal/gnome-terminal-server
Não é assim para 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"
}
Então, podemos torná-lo um pouco mais complexo (existem alguns bashisms aqui, este não é portátil):
$ ps -p 544 o args=
/usr/bin/python /usr/bin/terminator
Isso funciona para todos os casos em que testei.