Answers:
如果已wmctrl
安装,则命令的第一行输出
wmctrl -m
将显示窗口管理器的名称。如果尚未wmctrl
安装,请使用以下命令进行安装:
sudo apt-get install wmctrl
请注意,man wmctrl
(即的man
页面wmctrl
)部分表示:
-m显示有关窗口管理器的信息...
在我的Ubuntu 11.10 / Linux的3.0.0-14泛型#23,Ubuntu的x86_64的/ Metacity的2.34.1系统,从输出的第一行wmctrl -m
是: Name: Metacity
同时echo $DESKTOP_SESSION
显示ubuntu-2d
和echo $XDG_CURRENT_DESKTOP
显示Unity
。
在Ubuntu desktop
旧笔记本电脑上全新安装的Ubuntu 15.10 软件上,第一行的输出wmctrl -m
为:Name: Compiz
而DESKTOP_SESSION
and XDG_CURRENT_DESKTOP
值为ubuntu
andUnity
ssh -Y {host} 'wmctrl -m'
会返回一些值(例如,“名称:Compiz”和几个N / A),但ssh
在窗口管理器中包含有限的信息是有道理的。
wmctrl -d
(wmctrl -l
使用Window Maker在Xubuntu Wily上)(列出由窗口管理器管理的所有桌面)或 (列出由窗口管理器管理的窗口)中的任何一个都可以正常工作吗?
在Linux系统上,我测试的环境变量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迎宾员选择的登录选项。
要使用它们,请在终端上输入:
echo $XDG_CURRENT_DESKTOP
(如果使用Unity,将输出例如“ unity”)
要么
echo $GDMSESSION
(如果您在登录名中选择了ubuntu,将输出例如“ ubuntu”,如果在登录名中选择了它,则将输出“ ubuntu-2d”。)
如果您更仔细地观察env
类似DESKTOP_SESSION和COMPIZ_CONFIG_PROFILE的输出,则还有其他问题
由于您要查找的是正在使用的Window Manager的名称,因此,我看到此方法的唯一方法是查看进程列表。为此,有一个名为pgrep
(Wikipedia)的命令。我执行以下操作来获取名称,因为参数-l添加了进程ID:
pgrep -l compiz |cut -d " " -f2
由于该进程由同一用户运行,因此无需在sudo部分添加前缀。然后,您可以使用它来创建一个脚本,该脚本基于“窗口管理器”执行操作。
为了寻找其他类型的,只是换个词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}'
将通过管道获得的输入的每一行的第一列与给定的字符串进行比较,如果找到匹配的内容,则运行括号中的代码,该代码将打印出该行的第五列-发生这种情况(完全是偶然的,我打赌)是“ _NET_SUPPORTING_WM_CHECK”原子的ID;3.然后使用此ID通过xprop -id
我也在KDE进行测试,得出的结论是:
a)使用HardInfo的图形化方式:答案通常在“操作系统”>“桌面环境”中,但是如果没有,则可以查看“环境变量”。HardInfo已准备好所有经过测试的发行版,除了带有KDE的发行版外,它可以轻松,快速地安装(Linux Mint 13中只有2个软件包)。
b)中的命令行,用这个命令:ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm"
。出现在更多行中的项目应该是答案(如果有平局,则带有“会话”的项目应该是解决方案)。
gnome-...
过程(并打了一个kde kdevtmpfs
)
#! /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:” {print $ 5}')); xprop -id“ $ {id}” -notype -f _NET_WM_NAME 8t | grep“ _NET_WM_NAME =” | cut --delimiter =''--fields = 3 | 切--delimiter ='“'--fields = 2
使用dbus和Accounts Service(这在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
其环境来做到这一点)。