Versi asli
Salah satu cara untuk melakukan ini adalah dengan mendapatkan proses induk dari sesi shell Anda saat ini dan dari sana nama terminal.
Dapatkan orang tua dari proses shell saat ini. Variabel bash $$adalah PID dari shell Anda saat ini, sehingga kami dapat memberikannya sebagai permintaan untuk ps( -p $$) dan memintanya untuk mencetak PID dari proses induk ( -o ppid=, trailing =adalah untuk menghindari mencetak tajuk kolom):
$ ps -p $$ -o ppid=
544
Jadi, PID dari induk shell saya adalah 544.
Dapatkan proses yang terkait dengan PID itu dan cetak baris perintahnya
$ ps -p 544 o args=
/usr/bin/python /usr/bin/terminator
Output di atas akan tergantung pada emulator terminal apa yang Anda gunakan, saya menggunakan terminator.
Gabungkan semuanya dalam satu perintah
ps -p $(ps -p $$ -o ppid=) o args=
Gunakan itu untuk mendapatkan versinya
$(ps -p $(ps -p $$ -o ppid=) o args=) --version
terminator 0.97
Tambahkan sedikit fungsi ke Anda ~/.bashrcyang mengembalikan nama dan versi emulator terminal yang Anda gunakan (ini berfungsi untuk sebagian besar emulator terminal umum):
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}')
}
Anda sekarang bisa mendapatkan nama terminal dan juga memberikan opsi apa saja yang Anda suka (seperti --version.
Beberapa contoh menggunakan terminal berbeda:
xterm
$ which_term
XTerm(297)
terminator
$ which_term
terminator 0.97
rxvt, yang ini tidak memiliki -V, -versionatau --versionbendera sehingga tidak ada info versi yang dicetak.
$ 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/>.
Baru dan ditingkatkan
Pendekatan di atas tidak begitu dapat dipercaya. Ini akan tersedak ketika Anda menjalankan shell Anda setelah masuk suke pengguna lain atau ketika terminal Anda dialihkan ke sesuatu dan berbagai kasus lainnya. Karena kami jelas bekerja dengan program X di sini, cara yang lebih baik mungkin dengan menggunakan sesuatu seperti xdotool(dapat diinstal dengan sudo apt-get install xdotool) untuk mendapatkan informasi sebagai gantinya:
perl -lpe 's/\0/ /g' /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline
Di atas akan mencetak baris perintah yang digunakan untuk meluncurkan jendela yang sedang aktif. Karena terminal Anda, mungkin, akan aktif, itu adalah perintah yang akan ditampilkan. Ini berarti bahwa untuk sebagian besar emulator terminal, Anda dapat dengan aman mengasumsikan bahwa bidang pertama yang dikembalikan adalah nama terminal:
$ which_term
lxterminal
Ini berarti mendapatkan versi itu sepele. Sebagai contoh
$ dpkg -l $(which_term) | awk '/^ii/{print $3}'
0.1.11-4
Tidak demikian untuk gnome-terminal:
$ which_term
/usr/lib/gnome-terminal/gnome-terminal-server
atau terminator:
$ which_term
/usr/bin/python /usr/bin/terminator
Jadi, kita bisa membuatnya sedikit lebih rumit (ada beberapa bashisme di sini, yang ini tidak portabel):
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"
}
Ini berfungsi untuk semua kasus yang saya uji.