Phiên bản gốc
Một cách để làm điều này là lấy tiến trình cha của phiên shell hiện tại của bạn và từ đó tên của thiết bị đầu cuối.
Lấy cha mẹ của quá trình shell hiện tại. Biến bash $$
là PID của trình bao hiện tại của bạn, vì vậy chúng tôi có thể đưa ra đó như là một truy vấn cho ps
( -p $$
) và yêu cầu nó in ra PID của quy trình cha mẹ ( -o ppid=
, theo dõi =
là để tránh in các tiêu đề cột):
$ ps -p $$ -o ppid=
544
Vì vậy, PID của cha mẹ tôi là 544
.
Nhận quy trình liên quan đến PID đó và in dòng lệnh của nó
$ ps -p 544 o args=
/usr/bin/python /usr/bin/terminator
Đầu ra ở trên sẽ phụ thuộc vào trình giả lập thiết bị đầu cuối nào bạn đang sử dụng, tôi đang sử dụng terminator
.
Kết hợp mọi thứ trong một lệnh duy nhất
ps -p $(ps -p $$ -o ppid=) o args=
Sử dụng để có được phiên bản
$(ps -p $(ps -p $$ -o ppid=) o args=) --version
terminator 0.97
Thêm một chức năng nhỏ để ~/.bashrc
trả về tên và phiên bản của trình giả lập thiết bị đầu cuối bạn đang sử dụng (công cụ này hoạt động với hầu hết các trình giả lập thiết bị đầu cuối phổ biến):
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}')
}
Bây giờ bạn có thể lấy tên của thiết bị đầu cuối và cũng có thể chuyển bất kỳ tùy chọn nào bạn muốn cho nó (chẳng hạn như --version
.
Một số ví dụ sử dụng các thiết bị đầu cuối khác nhau:
xterm
$ which_term
XTerm(297)
terminator
$ which_term
terminator 0.97
rxvt
, cái này không có -V
, -version
hoặc --version
cờ nên không có thông tin phiên bản nào được in.
$ 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/>.
Mới và cải tiến
Cách tiếp cận trên không phải là đáng tin cậy mặc dù. Nó sẽ bị nghẹt khi bạn chạy shell sau khi su
ing cho người dùng khác hoặc khi thiết bị đầu cuối của bạn được đặt bí danh cho một cái gì đó và các trường hợp khác. Vì rõ ràng chúng tôi đang làm việc với các chương trình X ở đây, nên cách tốt hơn có thể là sử dụng một cái gì đó như xdotool
(có thể cài đặt với sudo apt-get install xdotool
) để lấy thông tin thay thế:
perl -lpe 's/\0/ /g' /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline
Ở trên sẽ in dòng lệnh được sử dụng để khởi chạy cửa sổ hiện đang hoạt động. Vì thiết bị đầu cuối của bạn, có lẽ sẽ hoạt động, đó là lệnh mà nó sẽ hiển thị. Điều này có nghĩa là đối với hầu hết các trình giả lập thiết bị đầu cuối, bạn có thể giả định rằng trường thứ 1 được trả về là tên thiết bị đầu cuối:
$ which_term
lxterminal
Điều này có nghĩa là nhận được phiên bản là tầm thường. Ví dụ
$ dpkg -l $(which_term) | awk '/^ii/{print $3}'
0.1.11-4
Không phải vậy gnome-terminal
:
$ which_term
/usr/lib/gnome-terminal/gnome-terminal-server
hoặc terminator
:
$ which_term
/usr/bin/python /usr/bin/terminator
Vì vậy, chúng ta có thể làm cho nó phức tạp hơn một chút (có một số bashism ở đây, cái này không phải là di động):
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"
}
Điều này làm việc cho tất cả các trường hợp tôi đã thử nghiệm trên.