有什么方法(例如命令或环境变量)来确定当前会话中正在积极运行的窗口管理器?

#1 楼

如果安装了wmctrl,则命令

wmctrl -m


的输出的第一行将显示窗口管理器的名称。如果未安装wmctrl,请使用以下命令进行安装:

sudo apt-get install wmctrl


注意,man wmctrl(即manwmctrl页面)部分说明:


-m在我的Ubuntu 11.10 / Linux 3.0.0-14-generic#23上显示有关窗口管理器的信息...


-Ubuntu x86_64 / metacity 2.34.1系统,来自wmctrl -m的第一行输出是:Name: Metacity
,而echo $DESKTOP_SESSION显示ubuntu-2decho $XDG_CURRENT_DESKTOP显示Unity

在全新安装的Ubuntu 15.10 Ubuntu desktop软件上安装在旧笔记本电脑上,wmctrl -m的第一行输出是:Name: Compiz
,而DESKTOP_SESSIONXDG_CURRENT_DESKTOP的值分别是ubuntuUnity

评论


不幸的是,即使启用了X11,它也不能在ssh上运行。

– Sridhar Sarnobat
2014年4月22日下午4:54

@ubridu 15.04上的@ Sridhar-Sarnobat,运行ssh -Y {host}'wmctrl -m'确实会返回一些值(例如,“ Name:Compiz”和几个N / A),但是ssh的信息有限关于窗口管理器。

–迈克尔
15年5月4日在2:52



在运行肉桂的debian上,这不起作用。 wmctrl -m的输出为Name:Mutter(Muffin),而$ XDG_CURRENT_DESKTOP = X-Cinnamon

–弗洛伊德
16年1月2日在8:58



在Xubuntu Wily上,运行Window Maker 0.95.6-wmctrl报告所有条目的N / A。 GDMSESSION设置为wmaker-common,但是根本没有设置XDG_CURRENT_DESKTOP。

–美
16年7月11日在19:13

@Mei,您是否可以在可以比较的任何其他系统上运行Window Maker?另外,在带有Window Maker的Xubuntu Wily上,wmctrl -d(列出由窗口管理器管理的所有桌面)或wmctrl -l(列出由窗口管理器管理的窗口)中的任何一个都可以正常工作吗?

–詹姆斯·沃尔德比-jwpat7
16年7月12日在18:55

#2 楼

在Linux系统上,我测试了环境变量XDG_CURRENT_DESKTOPGDMSESSION,并得到以下结果。

您可以使用此行来获取输出:
 printf 'Desktop: %s\nSession: %s\n' "$XDG_CURRENT_DESKTOP" "$GDMSESSION"
 


Ubuntu 18.04和20.04(GNOME上的Ubuntu)

XDG_CURRENT_DESKTOP=ubuntu:GNOME
GDMSESSION=ubuntu

Ubuntu 18.04(Ubuntu上Wayland)

XDG_CURRENT_DESKTOP=ubuntu:GNOME
GDMSESSION=ubuntu-wayland


Ubuntu 16.04
团结(7)

XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu


Ubuntu 14.04
与Mir共同运行

XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu

注意MIR_SERVER_NAME也设置

MIR_SERVER_NAME=session-$NUMBER

不带Mir的统一运行

XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu

XFCE

XDG_CURRENT_DESKTOP=XFCE
GDMSESSION=xfce


Ubuntu 12.04
KDE

XDG_CURRENT_DESKTOP=
GDMSESSION=kde-plasma

Unity 3D

XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu

Unity 2D

XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu-2d

Gnome

XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=gnome-shell

侏儒经典版

XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=gnome-classic

侏儒经典版(无效果)

XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=gnome-fallback

其他基于Ubuntu的发行版
Mint 13(肉桂色)

XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=cinnamon

薄荷16(KDE版)

XDG_CURRENT_DESKTOP=KDE
GDMSESSION=default

薄荷17(肉桂)

XDG_CURRENT_DESKTOP=X-Cinnamon
GDMSESSION=default

Lubuntu 12.04

XDG_CURRENT_DESKTOP=LXDE
GDMSESSION=Lubuntu


瓦斯塔14.04 / 18.04

XDG_CURRENT_DESKTOP=X-Cinnamon
GDMSESSION=cinnamon


Wasta 14.04使用Gnome桌面。

XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=gnome

Ubuntu Mate 18.04

XDG_CURRENT_DESKTOP=MATE
GDMSESSION=mate

Xubuntu 18.04

XDG_CURRENT_DESKTOP=XFCE
GDMSESSION=xubuntu

> Kali Linux kali-rolling 2020.2

XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=lightdm-xsession


评论


薄荷13(肉桂):XDG_CURRENT_DESKTOP = GNOME,GDMSESSION =肉桂

– rik-shaw
2012-12-11 18:02



Lubuntu 12.04:XDG_CURRENT_DESKTOP = LXDE,GDMSESSION = Lubuntu

– rik-shaw
2012年12月11日在18:07

$ DESKTOP_SESSION呢?作为备份解决方案:)

– Savvas Radevic
2013年1月2日,10:25

如果我不使用GDM怎么办?

– Robert Siemer
2014年3月13日在11:20

而且,它不能回答我使用什么窗口管理器!

– Robert Siemer
2015年3月9日,11:22

#3 楼

在终端中,键入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改为另一个mutterkwin等。 />

评论


那些只是告诉我会话名称和桌面环境。例如,它说“ GNOME”,这是一个可以使用Metacity,Mutter,Compiz或其他窗口管理器的桌面环境。它说“ gnome-classic”是一个会话名称,没有使用该名称的窗口管理器。

–匿名
2011-10-26 23:04

妳去找到了可以帮助处理列表的命令。 pgrep。转到该部分,至少可以找到找到的窗口管理器名称。尝试检查是否可以将所有这些都添加到那里。您的问题非常好,因为Ubuntu 11.10通过使用Compiz引起了一些混乱(如果在Gnome 3.x时则喃喃自语),那么指出在Unity中使用的实际Window Manager会很不错。

–路易斯·阿尔瓦拉多(Luis Alvarado)
11-10-27在0:11



$ XDG_CURRENT_DESKTOP是当前的桌面环境,而不是窗口管理器。

–肯·夏普
18年2月22日在16:49

#4 楼

我发现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}]


评论


这让我有了自定义的buildroot系统。

– jc__
19年2月5日在21:12

#5 楼

xprop -id $(xprop -root -notype | awk '=="_NET_SUPPORTING_WM_CHECK:"{print }') -notype -f _NET_WM_NAME 8t 


评论


您能解释一下这是如何工作的吗?另外,我认为您最后缺少)。

–路易·马蒂斯森(Louis Matthijssen)
2014年5月15日下午6:53

@LouisMatthijssen 1. xprop -root -notype显示所有根窗口的属性(并省略类型以简化解析),输出通过管道发送到awk。 2. awk指令$ 1 ==“ _ NET [blah] CK:” {print $ 5}'将通过管道获得的输入的每一行的第一列与给定的字符串进行比较,如果找到匹配项,则将其放在方括号中它从该行打印出第五列-恰好发生(我敢打赌,完全是偶然)是“ _NET_SUPPORTING_WM_CHECK”原子的ID; 3.然后,此ID再次用于通过xprop -id获取Windows Manager的属性。

–cprn
2014年5月15日19:31



#6 楼

#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e.wordpress.com)


windowManagerName () {
    local window=$(
        xprop -root -notype
    )

    local identifier=$(
        echo "${window}" |
        awk '=="_NET_SUPPORTING_WM_CHECK:"{print }'
    )

    local attributes=$(
        xprop -id "${identifier}" -notype -f _NET_WM_NAME 8t
    )

    local name=$(
        echo "${attributes}" |
        grep "_NET_WM_NAME = " |
        cut --delimiter=' ' --fields=3 |
        cut --delimiter='"' --fields=2
    )

    echo "${name}"
}


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 | cut
--delimiter ='“'--fields = 2


评论


这正好回答了这个问题!我找到的问题的唯一答案。

– opinion_no9
20年1月22日在20:53

#7 楼

我也在用KDE进行测试,得出的结论是:

a)使用HardInfo的图形化方式:答案通常在“操作系统”>“桌面环境”中,但是如果没有,您可以看一下到“环境变量”。 HardInfo可以用于所有经过测试的发行版,除了带有KDE的发行版之外,它可以轻松,快速地安装(Linux Mint 13中只有2个软件包)。

b)命令行,使用以下命令: ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm"。出现在更多行中的项目应该是答案(如果有平局,则带有“会话”的项目应该是解决方案)。

评论


XFCE还具有多个gnome -...进程(以及用kdevtmpfs命中kde)

– Xen2050
16年5月7日下午4:55

#8 楼

只需两美分。

$ sudo apt install neofetch
$ neofetch



#9 楼

以上都不是对我真正有用的,我只是想知道我是否在当前的桌面会话中运行了Gnome。

这是可行的,打开一个终端

lsb_release -a


(检查我的UBUNTU计算机上安装了哪种风味或版本)

ls /usr/bin/*session


(启动当前的桌面会话/桌面环境正在使用)

gnome-shell --version 


(找出已安装哪个版本的gnome)

评论


ls / usr / bin / * session告诉我安装了什么

– AlexOnLinux
20年6月18日在16:14

#10 楼

您可以使用名为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添加有关窗口管理器的信息。

#11 楼

使用dbus和Accounts Service(这在Ubuntu中都是默认设置)是可行的。

$ qdbus --system org.freedesktop.Accounts \                                                                
> /org/freedesktop/Accounts/User1000 \                                                                                     
> org.freedesktop.Accounts.User.XSession                                                                                   
ubuntu


值得一提的是,我已经通过lightdm(即图形登录屏幕)登录对它进行了测试,它确实检测到了像blackbox这样的经典桌面,并且显然检测Unity。我怀疑这是用户在登录屏幕上选择的会话的值,这就是为什么使用进程检查要容易一些的原因

#12 楼

脚本
以下脚本是对我在unix.se上发布的类似问题的最佳答案。
if [ "$XDG_CURRENT_DESKTOP" = '' ]
then
  desktop=$(echo "$XDG_DATA_DIRS" | sed 's/.*\(xfce\|kde\|gnome\).*//')
else
  desktop=$XDG_CURRENT_DESKTOP
fi

desktop=${desktop,,}  # convert to lower case
echo "$desktop"