Оригинальная версия
Один из способов сделать это - получить родительский процесс текущего сеанса оболочки и оттуда имя терминала.
Получить родителя текущего процесса оболочки. Переменная bash $$
- это PID вашей текущей оболочки, поэтому мы можем передать ее как запрос к ps
(-p $$
) и попросить tp напечатать PID родительского процесса ( -o ppid=
конечный результат =
состоит в том, чтобы избежать печати заголовков столбцов):
$ ps -p $$ -o ppid=
544
Итак, PID родителя моей оболочки есть 544
.
Получить процесс, связанный с этим PID, и распечатать его командную строку
$ ps -p 544 o args=
/usr/bin/python /usr/bin/terminator
Приведенный выше вывод будет зависеть от того, какой эмулятор терминала вы используете, я использую terminator
.
Объедините все в одной команде
ps -p $(ps -p $$ -o ppid=) o args=
Используйте это, чтобы получить версию
$(ps -p $(ps -p $$ -o ppid=) o args=) --version
terminator 0.97
Добавьте небольшую функцию к вашему ~/.bashrc
которая возвращает имя и версию используемого вами эмулятора терминала (это работает для большинства распространенных эмуляторов терминала):
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}')
}
Теперь вы можете получить имя терминала, а также передать любую понравившуюся вам опцию (например, --version
.
Некоторые примеры использования разных терминалов:
xterm
$ which_term
XTerm(297)
terminator
$ which_term
terminator 0.97
rxvt
, у этого нет ни одного -V
, -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/>.
Новый и улучшенный
Вышеуказанный подход не заслуживает доверия, хотя. Он захлебнется, когда вы запустите свою оболочку после su
обращения к другому пользователю или когда ваш терминал привязан к чему-либо и другим различным случаям. Поскольку мы, очевидно, работаем здесь с программами X, лучшим способом может быть использование чего-то вроде xdotool
(устанавливаемого вместе sudo apt-get install xdotool
) для получения информации:
perl -lpe 's/\0/ /g' /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline
Выше будет напечатана командная строка, используемая для запуска текущего активного окна. Поскольку ваш терминал, предположительно, будет активен, это команда, которую он покажет. Это означает, что для большинства эмуляторов терминалов можно смело предположить, что 1-е возвращенное поле является именем терминала:
$ which_term
lxterminal
Это означает, что получение версии тривиально. Например
$ dpkg -l $(which_term) | awk '/^ii/{print $3}'
0.1.11-4
Не так для gnome-terminal
:
$ which_term
/usr/lib/gnome-terminal/gnome-terminal-server
или terminator
:
$ which_term
/usr/bin/python /usr/bin/terminator
Таким образом, мы можем сделать его немного более сложным (здесь есть некоторые ошибки, этот не переносимый):
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"
}
Это работает для всех случаев, на которых я тестировал.