Оригінальна версія
Один із способів зробити це - отримати батьківський процес вашого поточного сеансу оболонки і звідти назву терміналу.
Отримайте батьків поточного процесу оболонки. Змінна 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
Вище буде надруковано командний рядок, який використовується для запуску активного вікна. Оскільки ваш термінал, імовірно, буде активним, це команда, яку він покаже. Це означає, що для більшості термінальних емуляторів ви можете сміливо припускати, що перше повернене поле є ім'ям терміналу:
$ 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"
}
Це працює для всіх випадків, на яких я перевірявся.