Câu trả lời:
Nếu bạn đã wmctrl
cài đặt, dòng đầu ra đầu tiên từ lệnh
wmctrl -m
sẽ cho bạn thấy tên của người quản lý cửa sổ. Nếu bạn chưa wmctrl
cài đặt, hãy sử dụng lệnh sau để cài đặt nó:
sudo apt-get install wmctrl
Lưu ý, man wmctrl
(có nghĩa là, man
trang cho wmctrl
) nói một phần:
-m Hiển thị thông tin về trình quản lý cửa sổ ...
Trên hệ thống Ubuntu 11.10 / Linux 3.0.0-14-chung # 23-Ubuntu x86_64 / metacity 2.34.1 của tôi, dòng đầu ra đầu tiên từ wmctrl -m
là: Name: Metacity
trong khi echo $DESKTOP_SESSION
hiển thị ubuntu-2d
và echo $XDG_CURRENT_DESKTOP
hiển thị Unity
.
Trên bản cài đặt Ubuntu desktop
phần mềm Ubuntu 15.10 mới trên máy tính xách tay cũ, dòng đầu ra đầu tiên wmctrl -m
là: Name: Compiz
trong khi DESKTOP_SESSION
và XDG_CURRENT_DESKTOP
các giá trị là ubuntu
vàUnity
ssh -Y {host} 'wmctrl -m'
sẽ trả về một số giá trị (ví dụ: "Tên: Compiz" và một số N / A), nhưng điều đó có nghĩa là ssh
sẽ có thông tin hạn chế về trình quản lý cửa sổ.
wmctrl -d
(Liệt kê tất cả các máy tính để bàn được quản lý bởi trình quản lý cửa sổ) hoặc wmctrl -l
(Liệt kê các cửa sổ đang được quản lý cửa sổ quản lý) hoạt động tốt trên Xubfox Wily với Window Maker?
Trên các hệ thống Linux Tôi đã thử nghiệm biến môi trường XDG_CURRENT_DESKTOP
và GDMSESSION
và nhận được kết quả như sau.
Bạn có thể sử dụng dòng này để có được đầu ra:
printf 'Desktop: %s\nSession: %s\n' "$XDG_CURRENT_DESKTOP" "$GDMSESSION"
XDG_CURRENT_DESKTOP=ubuntu:GNOME
GDMSESSION=ubuntu
XDG_CURRENT_DESKTOP=ubuntu:GNOME
GDMSESSION=ubuntu-wayland
XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu
XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu
Lưu ý MIR_SERVER_NAME cũng được đặt
MIR_SERVER_NAME=session-$NUMBER
XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu
XDG_CURRENT_DESKTOP=XFCE
GDMSESSION=xfce
XDG_CURRENT_DESKTOP=
GDMSESSION=kde-plasma
XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu
XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu-2d
XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=gnome-shell
XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=gnome-classic
XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=gnome-fallback
XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=cinnamon
XDG_CURRENT_DESKTOP=KDE
GDMSESSION=default
XDG_CURRENT_DESKTOP=X-Cinnamon
GDMSESSION=default
XDG_CURRENT_DESKTOP=LXDE
GDMSESSION=Lubuntu
XDG_CURRENT_DESKTOP=X-Cinnamon
GDMSESSION=cinnamon
XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=gnome
XDG_CURRENT_DESKTOP=MATE
GDMSESSION=mate
XDG_CURRENT_DESKTOP=XFCE
GDMSESSION=xubuntu
Trong các loại thiết bị đầu cuối env
để xem tất cả các biến môi trường. Một số trong số họ là:
XDG_CURRENT_DESKTOP - Cho bạn biết bạn đang sử dụng môi trường máy tính để bàn nào
GDMSESSION - Cho bạn biết tùy chọn nào bạn đã chọn từ trình chào mừng lightdm để đăng nhập.
Để sử dụng chúng, hãy đi đến thiết bị đầu cuối và gõ:
echo $XDG_CURRENT_DESKTOP
(Sẽ xuất ra ví dụ 'unity' nếu bạn đang sử dụng Unity)
hoặc là
echo $GDMSESSION
(Sẽ xuất ra ví dụ 'ubfox' nếu bạn đã chọn ubfox trong thông tin đăng nhập hoặc 'ubfox-2d' nếu bạn chọn mục đó trong thông tin đăng nhập.)
Bạn có những người khác nếu bạn nhìn kỹ hơn vào đầu ra env
như DESKTOP_SESSION và COMPIZ_CONFIG_PROFILE
Vì những gì bạn đang tìm kiếm là tên của Window Manager đang sử dụng, cách duy nhất tôi thấy làm thế nào để có được điều này là bằng cách tìm trong danh sách quy trình. Để làm điều này, có một lệnh gọi là pgrep
( Wikipedia ). Tôi đã làm như sau để có được tên vì tham số -l thêm ID tiến trình:
pgrep -l compiz |cut -d " " -f2
do quá trình đang được chạy bởi cùng một người dùng nên không cần phải thêm tiền tố vào phần sudo. Sau đó, bạn có thể sử dụng điều này để tạo một tập lệnh thực hiện một hành động dựa trên Trình quản lý cửa sổ.
Để tìm kiếm các loại khác, chỉ cần thay đổi chữ compiz
khác như mutter
, kwin
, vv ..
$XDG_CURRENT_DESKTOP
là môi trường máy tính để bàn hiện tại, KHÔNG phải là trình quản lý cửa sổ.
Tôi tìm thấy pstree
một sự giúp đỡ lớn.
sudo apt-get install pstree
Đây là những gì tôi nhận được.
├─lightdm─┬─Xorg───2*[{Xorg}]
│ ├─lightdm─┬─gnome-session─┬─bluetooth-apple───2*[{bluetooth-apple}]
│ │ │ ├─compiz─┬─sh───gtk-window-deco───2*[{gtk-window-deco}]
│ │ │ │ └─5*[{compiz}]
│ │ │ ├─deja-dup-monito───2*[{deja-dup-monito}]
│ │ │ ├─gnome-fallback-───2*[{gnome-fallback-}]
│ │ │ ├─gnome-screensav───2*[{gnome-screensav}]
│ │ │ ├─gnome-settings-───2*[{gnome-settings-}]
│ │ │ ├─nautilus───2*[{nautilus}]
│ │ │ ├─nm-applet───2*[{nm-applet}]
│ │ │ ├─polkit-gnome-au───2*[{polkit-gnome-au}]
│ │ │ ├─ssh-agent
│ │ │ ├─telepathy-indic───2*[{telepathy-indic}]
│ │ │ ├─update-notifier───2*[{update-notifier}]
│ │ │ ├─vino-server───2*[{vino-server}]
│ │ │ ├─zeitgeist-datah───{zeitgeist-datah}
│ │ │ └─3*[{gnome-session}]
│ │ └─{lightdm}
│ └─2*[{lightdm}]
xprop -id $(xprop -root -notype | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}') -notype -f _NET_WM_NAME 8t
)
cuối cùng.
xprop -root -notype
hiển thị tất cả các thuộc tính của cửa sổ gốc (và bỏ qua các loại để phân tích cú pháp dễ dàng hơn), đầu ra được gửi đến awk
qua đường ống; 2. awk
hướng dẫn $1=="_NET[blah]CK:"{print $5}'
so sánh cột đầu tiên của mỗi hàng của đầu vào mà nó đã đi qua ống với một chuỗi đã cho và nếu tìm thấy kết quả khớp, nó sẽ chạy mã trong ngoặc in cột thứ năm từ hàng này - hoàn toàn ngẫu nhiên (hoàn toàn tình cờ, Tôi đặt cược) là ID của nguyên tử "_NET_SUPPORTING_WM_CHECK"; 3. ID này sau đó được sử dụng lại để lấy các thuộc tính của Trình quản lý Windows vớixprop -id
Tôi cũng đã thử nghiệm với KDE và kết luận của tôi là:
a) Cách đồ họa, với HardInfo: câu trả lời thường có trong "Hệ điều hành"> "Môi trường máy tính để bàn", nhưng nếu không, bạn có thể tìm đến "Biến môi trường". HardInfo đã sẵn sàng với tất cả các bản phát hành được thử nghiệm, ngoại trừ bản phân phối có KDE, nhưng nó có thể được cài đặt dễ dàng và nhanh chóng (chỉ có 2 gói trong Linux Mint 13).
b) Dòng lệnh, với lệnh này : ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm"
. Mục xuất hiện trong nhiều dòng hơn sẽ là câu trả lời (nếu có một mục rút ra với "phiên" sẽ là giải pháp).
gnome-...
quy trình (và một kde hit với kdevtmpfs
)
Không có cái nào ở trên thực sự hiệu quả với tôi, tôi chỉ muốn biết liệu tôi có Gnome chạy như phiên máy tính để bàn hiện tại của tôi không.
Đây là những gì đã làm việc, mở một thiết bị đầu cuối
lsb_release -a
(để kiểm tra hương vị hoặc phiên bản nào tôi đã cài đặt trên máy UBUNTU của mình)
ls /usr/bin/*session
(khởi chạy phiên môi trường máy tính để bàn / môi trường máy tính để bàn hiện đang sử dụng)
gnome-shell --version
(để tìm ra phiên bản gnome nào được cài đặt)
#! /bin/bash
# (GPL3+) Alberto Salvia Novella (es20490446e.wordpress.com)
windowManagerName () {
window=$(xprop -root -notype)
identifier=$(echo "${window}" | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}')
attributes=$(xprop -id "${identifier}" -notype -f _NET_WM_NAME 8t)
echo "${attributes}" |
grep "_NET_WM_NAME = " |
cut --delimiter=' ' --fields=3 |
cut --delimiter='"' --fields=2
}
windowManagerName
Hoặc trong một dòng:
id = $ (xprop -root -notype | awk '$ 1 == "_ NET_SUPPORTING_WM_CHECK:" {in $ 5}'); xprop -id "$ {id}" -notype -f _NET_WM_NAME 8t | grep "_NET_WM_NAME =" | cắt --d006iter = '' --fields = 3 | cắt --d006iter = '"' --fields = 2
Đây là loại có thể với dbus và Dịch vụ tài khoản (cả hai theo mặc định trong Ubuntu).
$ qdbus --system org.freedesktop.Accounts \
> /org/freedesktop/Accounts/User1000 \
> org.freedesktop.Accounts.User.XSession
ubuntu
Đáng chú ý là tôi đã thử nghiệm điều này bằng cách đăng nhập thông qua lightdm (đó là màn hình đăng nhập đồ họa), nó đã phát hiện một máy tính để bàn cổ điển như hộp đen và rõ ràng phát hiện ra Unity. Tôi nghi ngờ đây là giá trị của những gì người dùng chọn trên màn hình đăng nhập dưới dạng phiên, đó là lý do tại sao việc sử dụng kiểm tra các quy trình dễ dàng hơn một chút
Các kịch bản sau đây kết quả là câu trả lời tốt nhất cho một tương tự câu hỏi tôi gửi qua tại unix.se . Nó cũng hoạt động tuyệt vời với Unity và LXDE.
if [ "$XDG_CURRENT_DESKTOP" = '' ]
then
desktop=$(echo "$XDG_DATA_DIRS" | sed 's/.*\(xfce\|kde\|gnome\).*/\1/')
else
desktop=$XDG_CURRENT_DESKTOP
fi
desktop=${desktop,,} # convert to lower case
echo "$desktop"
Bạn có thể sử dụng công cụ được gọi là inxi
. Nó có thể được lấy từ kho Ubuntu bằng cách:
sudo apt install inxi
hoặc từ github: https://github.com/smxi/inxi
Chỉ cần chạy lệnh như sau:
inxi -Sx
System: Host: blackhole Kernel: 5.1.15-050115-lowlatency x86_64 bits: 64 compiler: gcc v: 8.3.0
Desktop: i3 4.16.1-178-g31c0f1b8 Distro: Ubuntu 19.04 (Disco Dingo)
Lưu ý Desktop: i3
một phần. Trong trường hợp của tôi, trình quản lý cửa sổ tôi sử dụng là i3
.
Tùy chọn -S
hiển thị thông tin hệ thống và x
thêm thông tin về trình quản lý cửa sổ.
Tôi chỉ có thể nghĩ đến việc kiểm tra các trình quản lý cửa sổ đã biết trong các quy trình đang chạy. Đã từng có một khóa trong gconf được đặt thành trình quản lý cửa sổ ưa thích, nhưng nó không dùng nữa kể từ Gnome 2.12.
Vì vậy, nếu điều này là cho mục đích lập trình, tôi khuyên bạn nên nghiên cứu cho tất cả các trình quản lý cửa sổ linux; Một số phổ biến là:
Bạn sẽ phải chạy một kiểm tra cho từng lệnh pgrep -l $WINDOW_MANAGER
, đây $WINDOW_MANAGER
là tên của trình quản lý cửa sổ mà bạn muốn kiểm tra. Các pgrep
kiểm tra lệnh cho tiến trình đang chạy.
Tôi không chắc chắn 100% nếu Gnome Shell được coi là người quản lý cửa sổ; phần còn lại của các trình quản lý cửa sổ tôi nhận được từ một danh sách trong /usr/bin/gnome-wm
tập lệnh. Tập lệnh này trong thực tế nên có thể sử dụng được (vì nó có trong bản cài đặt sạch) nhưng trong trường hợp của tôi, nó cố gắng chạy compiz
mà không phải là trình quản lý cửa sổ mặc định của tôi (không phải trong phiên Gnome của tôi).
BIÊN TẬP:
Vâng, nhận xét của @Anarci dường như chính xác hơn. Trong trường hợp của tôi, nó đã hiển thị gnome-shell
.
pgrep -l "compiz|metacity|mutter|kwin|sawfish|fluxbox|openbox|xmonad"
$DISPLAY
trong môi trường của nó).