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_SESSIONand XDG_CURRENT_DESKTOP值为ubuntuandUnity
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:GNOMEGDMSESSION=ubuntuXDG_CURRENT_DESKTOP=ubuntu:GNOMEGDMSESSION=ubuntu-waylandXDG_CURRENT_DESKTOP=UnityGDMSESSION=ubuntuXDG_CURRENT_DESKTOP=UnityGDMSESSION=ubuntu注意MIR_SERVER_NAME也已设置
MIR_SERVER_NAME=session-$NUMBERXDG_CURRENT_DESKTOP=UnityGDMSESSION=ubuntuXDG_CURRENT_DESKTOP=XFCEGDMSESSION=xfceXDG_CURRENT_DESKTOP=GDMSESSION=kde-plasmaXDG_CURRENT_DESKTOP=UnityGDMSESSION=ubuntuXDG_CURRENT_DESKTOP=UnityGDMSESSION=ubuntu-2dXDG_CURRENT_DESKTOP=GNOMEGDMSESSION=gnome-shellXDG_CURRENT_DESKTOP=GNOMEGDMSESSION=gnome-classicXDG_CURRENT_DESKTOP=GNOMEGDMSESSION=gnome-fallbackXDG_CURRENT_DESKTOP=GNOMEGDMSESSION=cinnamonXDG_CURRENT_DESKTOP=KDEGDMSESSION=defaultXDG_CURRENT_DESKTOP=X-CinnamonGDMSESSION=defaultXDG_CURRENT_DESKTOP=LXDE GDMSESSION=LubuntuXDG_CURRENT_DESKTOP=X-Cinnamon GDMSESSION=cinnamonXDG_CURRENT_DESKTOP=GNOME GDMSESSION=gnomeXDG_CURRENT_DESKTOP=MATEGDMSESSION=mateXDG_CURRENT_DESKTOP=XFCEGDMSESSION=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其环境来做到这一点)。