มีวิธีใดบ้าง (เช่นคำสั่งหรือตัวแปรสภาวะแวดล้อม) เพื่อพิจารณาว่าตัวจัดการหน้าต่างคืออะไรที่ทำงานอยู่ในเซสชันปัจจุบันหรือไม่?
มีวิธีใดบ้าง (เช่นคำสั่งหรือตัวแปรสภาวะแวดล้อม) เพื่อพิจารณาว่าตัวจัดการหน้าต่างคืออะไรที่ทำงานอยู่ในเซสชันปัจจุบันหรือไม่?
คำตอบ:
หากคุณwmctrl
ติดตั้งแล้วบรรทัดแรกของเอาต์พุตจากคำสั่ง
wmctrl -m
จะแสดงชื่อผู้จัดการหน้าต่าง หากคุณยังไม่ได้wmctrl
ติดตั้งให้ใช้คำสั่งต่อไปนี้เพื่อติดตั้ง:
sudo apt-get install wmctrl
หมายเหตุman wmctrl
(นั่นคือman
หน้าสำหรับwmctrl
) กล่าวในส่วน:
-m แสดงข้อมูลเกี่ยวกับเครื่องมือจัดการหน้าต่าง ...
บน Ubuntu 11.10 ของฉัน / Linux 3.0.0-14 ทั่วไป # 23 อูบุนตู x86_64 / Metacity 2.34.1 ระบบบรรทัดแรกของผลลัพธ์จากwmctrl -m
ถูก: Name: Metacity
ในขณะที่echo $DESKTOP_SESSION
แสดงให้เห็นubuntu-2d
และแสดงให้เห็นว่าecho $XDG_CURRENT_DESKTOP
Unity
บน Ubuntu 15.10 ที่เพิ่งติดตั้งUbuntu desktop
ซอฟต์แวร์ใหม่บนแล็ปท็อปเก่าบรรทัดแรกของผลลัพธ์wmctrl -m
คือ: Name: Compiz
ในขณะที่DESKTOP_SESSION
และXDG_CURRENT_DESKTOP
ค่าต่าง ๆubuntu
และUnity
ssh -Y {host} 'wmctrl -m'
จะส่งคืนค่าบางค่า (เช่น "ชื่อ: Compiz" และหลาย N / A) แต่มันสมเหตุสมผลที่ssh
จะมีข้อมูล จำกัด เกี่ยวกับตัวจัดการหน้าต่าง
wmctrl -d
(แสดงรายการเดสก์ท็อปทั้งหมดที่จัดการโดยตัวจัดการหน้าต่าง) หรือ wmctrl -l
(แสดงรายการหน้าต่างที่จัดการโดยตัวจัดการหน้าต่าง) ทำงานได้ดีบน Xubuntu Wily กับ Window Maker หรือไม่
บนระบบลินุกซ์ผมทดสอบตัวแปรสภาพแวดล้อมXDG_CURRENT_DESKTOP
และGDMSESSION
และได้ผลดังต่อไปนี้
คุณสามารถใช้บรรทัดนี้เพื่อรับเอาต์พุต:
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
หมายเหตุ MIR_SERVER_NAME ถูกตั้งค่าด้วย
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
ในประเภทอาคารenv
เพื่อดูตัวแปรสภาพแวดล้อมทั้งหมด บางส่วนของพวกเขาคือ:
XDG_CURRENT_DESKTOP - บอกให้คุณทราบถึงสภาพแวดล้อมของเดสก์ท็อปที่คุณใช้
GDMSESSION - บอกสิ่งที่คุณเลือกจากตัวเลือก lightdm greeter เพื่อเข้าสู่ระบบ
หากต้องการใช้งานให้ไปที่เทอร์มินัลแล้วพิมพ์:
echo $XDG_CURRENT_DESKTOP
(จะแสดงผลตัวอย่างเช่น 'unity' หากคุณใช้ Unity)
หรือ
echo $GDMSESSION
(จะแสดงผลตัวอย่างเช่น 'ubuntu' หากคุณเลือก ubuntu ในการเข้าสู่ระบบหรือ 'ubuntu-2d' หากคุณเลือกไว้ในการเข้าสู่ระบบ)
คุณมีคนอื่น ๆ ถ้าคุณดูผลลัพธ์ของenv
เช่นDESKTOP_SESSIONและCOMPIZ_CONFIG_PROFILE ให้ละเอียดยิ่งขึ้น
เนื่องจากสิ่งที่คุณกำลังมองหาคือชื่อของตัวจัดการหน้าต่างที่ใช้งานวิธีเดียวที่ฉันเห็นวิธีรับคือโดยดูในรายการกระบวนการ การทำเช่นนี้มีคำสั่งที่เรียกว่าpgrep
( Wikipedia ) ฉันทำต่อไปนี้เพื่อรับชื่อเนื่องจากพารามิเตอร์ -l เพิ่ม ID กระบวนการ:
pgrep -l compiz |cut -d " " -f2
ตั้งแต่กระบวนการกำลังทำงานโดยผู้ใช้เดียวกันไม่จำเป็นต้องนำหน้าส่วน sudo จากนั้นคุณสามารถใช้สิ่งนี้เพื่อสร้างสคริปต์ที่ดำเนินการตาม Window Manager
ที่จะมองหาประเภทอื่น ๆ เพียงแค่เปลี่ยนคำcompiz
ไปยังอีกเช่นmutter
, kwin
ฯลฯ ..
$XDG_CURRENT_DESKTOP
เป็นสภาพแวดล้อมเดสก์ทอปปัจจุบันไม่ใช่ตัวจัดการหน้าต่าง
ฉันพบว่าpstree
ช่วยได้มาก
sudo apt-get install pstree
นี่คือสิ่งที่ฉันได้รับ
├─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
)
ในตอนท้าย
xprop -root -notype
แสดงคุณสมบัติทั้งหมดของหน้าต่างรูต (และละเว้นประเภทสำหรับการแยกวิเคราะห์ได้ง่ายขึ้น) เอาต์พุตจะถูกส่งไปยังawk
ผ่านไพพ์ 2. awk
คำสั่ง$1=="_NET[blah]CK:"{print $5}'
เปรียบเทียบคอลัมน์แรกของแต่ละแถวของอินพุตที่ได้รับผ่านไปป์กับสตริงที่กำหนดและหากพบการจับคู่จะรันโค้ดในวงเล็บซึ่งพิมพ์คอลัมน์ที่ห้าจากแถวนี้ - เกิดขึ้นโดยบังเอิญ ฉันเดิมพัน) เพื่อเป็น ID ของอะตอม "_NET_SUPPORTING_WM_CHECK" 3. ID นี้จะถูกใช้อีกครั้งเพื่อรับคุณสมบัติของตัวจัดการ Windows ด้วยxprop -id
ฉันได้ทำการทดสอบกับ KDE ด้วยและข้อสรุปของฉันคือ:
a) วิธีกราฟิกกับ HardInfo: คำตอบอยู่ใน "ระบบปฏิบัติการ"> "สภาพแวดล้อมของเดสก์ท็อป" แต่ถ้าไม่ใช่คุณสามารถดูที่ "ตัวแปรสภาพแวดล้อม" HardInfo พร้อมกับ distros ที่ทดสอบแล้วทั้งหมดยกเว้นอันที่มี KDE แต่สามารถติดตั้งได้ง่ายและรวดเร็ว (เพียง 2 แพ็คเกจใน Linux Mint 13)
ข) ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm"
บรรทัดคำสั่งด้วยคำสั่งนี้: รายการที่ปรากฏในบรรทัดเพิ่มเติมควรเป็นคำตอบ (หากมีการวาดรายการที่มี "เซสชั่น" ควรเป็นทางออก)
gnome-...
กระบวนการหลายขั้นตอน (และ kde hit ด้วยkdevtmpfs
)
ข้างต้นไม่ได้ผลสำหรับฉันฉันแค่อยากจะรู้ว่าฉันใช้ Gnome เป็นเซสชันเดสก์ท็อปปัจจุบันของฉันหรือไม่
นี่คือสิ่งที่ทำงานได้เปิดเทอร์มินัล
lsb_release -a
(เพื่อตรวจสอบว่าฉันได้ติดตั้งรสชาติหรือรุ่นใดบนเครื่อง UBUNTU ของฉัน)
ls /usr/bin/*session
(เปิดใช้เซสชันเดสก์ท็อป / สภาพแวดล้อมเดสก์ท็อปที่ใช้งานอยู่)
gnome-shell --version
(เพื่อดูว่ามีการติดตั้ง gnome รุ่นใด)
#! /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
หรือในหนึ่งบรรทัด:
id = $ (xprop -root -notype | awk '$ 1 == "_ NET_SUPPORTING_WM_CHECK:" {พิมพ์ $ 5}'); xprop -id "$ {id}" -notype -f _NET_WM_NAME 8t | grep "_NET_WM_NAME =" | ตัด --delimiter = '' - ฟิลด์ = 3 | cut --delimiter = '"' - ฟิลด์ = 2
สิ่งนี้สามารถจัดทำได้ด้วย dbus และ Accounts (ทั้งสองค่าเริ่มต้นใน Ubuntu)
$ qdbus --system org.freedesktop.Accounts \
> /org/freedesktop/Accounts/User1000 \
> org.freedesktop.Accounts.User.XSession
ubuntu
น่าสังเกตว่าฉันได้ทดสอบสิ่งนี้ด้วยการเข้าสู่ระบบผ่าน lightdm (นั่นคือหน้าจอเข้าสู่ระบบแบบกราฟิก) มันตรวจจับเดสก์ท็อปแบบคลาสสิคเช่น blackbox และตรวจจับ Unity อย่างชัดเจน ฉันสงสัยว่านี่เป็นค่าของสิ่งที่ผู้ใช้เลือกบนหน้าจอการเข้าสู่ระบบเป็นเซสชันนั่นเป็นเหตุผลว่าทำไมการใช้กระบวนการตรวจสอบกระบวนการจึงง่ายขึ้นเล็กน้อย
สคริปต์ต่อไปนี้ส่งผลให้เป็นคำตอบที่ดีที่สุดในการที่คล้ายกันคำถามที่ผมโพสต์มากกว่าที่ unix.se มันใช้งานได้ดีกับ Unity และ 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"
inxi
คุณสามารถใช้เครื่องมือที่เรียกว่า สามารถรับได้จากที่เก็บ Ubuntu โดย:
sudo apt install inxi
หรือจาก GitHub: https://github.com/smxi/inxi
เพียงรันคำสั่งดังนี้:
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)
หมายเหตุDesktop: i3
ส่วนหนึ่ง i3
ในกรณีของฉันจัดการหน้าต่างที่ผมใช้เป็น
ตัวเลือก-S
แสดงข้อมูลระบบและx
เพิ่มข้อมูลเกี่ยวกับตัวจัดการหน้าต่าง
ฉันสามารถนึกถึงการตรวจสอบผู้จัดการหน้าต่างที่รู้จักในกระบวนการทำงาน เคยมีคีย์ใน gconf ที่ตั้งค่าเป็นตัวจัดการหน้าต่างที่ต้องการ แต่เลิกใช้แล้วตั้งแต่ Gnome 2.12
ดังนั้นหากนี่คือจุดประสงค์ในการเขียนโปรแกรมฉันขอแนะนำให้คุณศึกษาตัวจัดการหน้าต่าง linux ทั้งหมด ความนิยมคือ:
คุณจะต้องเรียกใช้การตรวจสอบสำหรับแต่ละคำสั่งpgrep -l $WINDOW_MANAGER
โดยที่$WINDOW_MANAGER
เป็นชื่อของตัวจัดการหน้าต่างที่คุณต้องการตรวจสอบ pgrep
การตรวจสอบคำสั่งสำหรับกระบวนการทำงาน
ฉันไม่แน่ใจ 100% ว่า Gnome Shell เป็นตัวจัดการหน้าต่างหรือไม่ ส่วนที่เหลือของผู้จัดการหน้าต่างที่ฉันได้รับจากรายการใน/usr/bin/gnome-wm
สคริปต์ อันที่จริงสคริปต์นี้ควรจะใช้งานได้ (ตั้งแต่มีอยู่ในการติดตั้งใหม่ทั้งหมด) แต่ในกรณีของฉันพยายามเรียกใช้compiz
ซึ่งไม่ใช่ตัวจัดการหน้าต่างเริ่มต้นของฉัน (ไม่ใช่ในเซสชัน Gnome ของฉัน)
แก้ไข:
ความเห็นของ @Anarci ก็ดูเหมือนจะแม่นยำยิ่งขึ้น gnome-shell
ในกรณีของฉันมันไม่แสดง
pgrep -l "compiz|metacity|mutter|kwin|sawfish|fluxbox|openbox|xmonad"
$DISPLAY
สภาพแวดล้อมของหน้าต่าง)