我正在编写一个bash
脚本,该脚本需要知道正在运行哪个桌面环境(XFCE,Unity,KDE,LXDE,Mate,Cinnamon,GNOME2,GNOME3等)。
我如何获得该信息?
我正在编写一个bash
脚本,该脚本需要知道正在运行哪个桌面环境(XFCE,Unity,KDE,LXDE,Mate,Cinnamon,GNOME2,GNOME3等)。
我如何获得该信息?
Answers:
检查的主要问题DESKTOP_SESSION
是它是由显示管理器而不是桌面会话设置的,并且存在不一致的地方。对于lightdm
在Debian上,值来自下的文件名/usr/share/xsessions/
。DESKTOP_SESSION
如果在登录时进行了特定选择,则反映了桌面环境,但是lightdm-xsession
默认情况下始终使用。
GDMSESSION
是另一种选择,但似乎也有类似的困境(与DESKTOP_SESSION
我的价值相同)。
XDG_CURRENT_DESKTOP
看起来是一个不错的选择,但是目前它不在XDG标准中,因此并不总是可以实现。请参阅此处的讨论。此答案显示了其在不同发行版/桌面上的价值,我还可以确认XFCE上当前不支持该版本。
对于XDG_CURRENT_DESKTOP
不存在的合理回退将尝试XDG_DATA_DIRS
。如果将用于桌面环境的数据文件安装在带有其名称的目录中,则该方法应该可以使用。希望所有发行版/台式机都是这种情况!
以下(使用GNU grep)对XFCE,KDE和Gnome进行测试:
echo "$XDG_DATA_DIRS" | grep -Eo 'xfce|kde|gnome'
兼容POSIX:
echo "$XDG_DATA_DIRS" | sed 's/.*\(xfce\|kde\|gnome\).*/\1/'
与检查结合使用XDG_CURRENT_DESKTOP
:
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"
apt-file
也是查看各种桌面安装位置的好工具。
XDG_DATA_DIRS
存在或仅不包含任何有用的内容?
||
样式为每个桌面做他想做的事情。在其他SE网站上仍然有人问过这个问题,我认为我们有最好的答案。
我认为您可以通过查询环境变量来找出答案$DESKTOP_SESSION
。我并不完全肯定这种支持的广泛性,但在有限的测试中,它似乎可以在Fedora和Ubuntu上使用。
$ echo $DESKTOP_SESSION
gnome
另一个选择是$XDG_SESSION_DESKTOP
变量。
还有一种使用的方法wmctrl
。
$ wmctrl -m
Name: GNOME Shell
Class: N/A
PID: N/A
Window manager's "showing the desktop" mode: N/A
$GDMSESSION
让我感到紧张,因为它可能只针对使用GDM或基于GNOME的DE的DE。GDM = GNOME显示管理器。
DESKTOP_SESSION
在xfce上。
default
(薄荷糖15)
default
了这一点。默认安装GNOME的3
$DESKTOP_SESSION
显示default
了KDE的Fedora 20下
您可以使用此bash脚本。它可以检测桌面环境名称和版本。
#!/bin/bash
function detect_gnome()
{
ps -e | grep -E '^.* gnome-session$' > /dev/null
if [ $? -ne 0 ];
then
return 0
fi
VERSION=`gnome-session --version | awk '{print $2}'`
DESKTOP="GNOME"
return 1
}
function detect_kde()
{
ps -e | grep -E '^.* kded4$' > /dev/null
if [ $? -ne 0 ];
then
return 0
else
VERSION=`kded4 --version | grep -m 1 'KDE' | awk -F ':' '{print $2}' | awk '{print $1}'`
DESKTOP="KDE"
return 1
fi
}
function detect_unity()
{
ps -e | grep -E 'unity-panel' > /dev/null
if [ $? -ne 0 ];
then
return 0
fi
VERSION=`unity --version | awk '{print $2}'`
DESKTOP="UNITY"
return 1
}
function detect_xfce()
{
ps -e | grep -E '^.* xfce4-session$' > /dev/null
if [ $? -ne 0 ];
then
return 0
fi
VERSION=`xfce4-session --version | grep xfce4-session | awk '{print $2}'`
DESKTOP="XFCE"
return 1
}
function detect_cinnamon()
{
ps -e | grep -E '^.* cinnamon$' > /dev/null
if [ $? -ne 0 ];
then
return 0
fi
VERSION=`cinnamon --version | awk '{print $2}'`
DESKTOP="CINNAMON"
return 1
}
function detect_mate()
{
ps -e | grep -E '^.* mate-panel$' > /dev/null
if [ $? -ne 0 ];
then
return 0
fi
VERSION=`mate-about --version | awk '{print $4}'`
DESKTOP="MATE"
return 1
}
function detect_lxde()
{
ps -e | grep -E '^.* lxsession$' > /dev/null
if [ $? -ne 0 ];
then
return 0
fi
# We can detect LXDE version only thru package manager
which apt-cache > /dev/null 2> /dev/null
if [ $? -ne 0 ];
then
which yum > /dev/null 2> /dev/null
if [ $? -ne 0 ];
then
VERSION='UNKNOWN'
else
# For Fedora
VERSION=`yum list lxde-common | grep lxde-common | awk '{print $2}' | awk -F '-' '{print $1}'`
fi
else
# For Lubuntu and Knoppix
VERSION=`apt-cache show lxde-common /| grep 'Version:' | awk '{print $2}' | awk -F '-' '{print $1}'`
fi
DESKTOP="LXDE"
return 1
}
function detect_sugar()
{
if [ "$DESKTOP_SESSION" == "sugar" ];
then
VERSION=`python -c "from jarabe import config; print config.version"`
DESKTOP="SUGAR"
else
return 0
fi
}
DESKTOP="UNKNOWN"
if detect_unity;
then
if detect_kde;
then
if detect_gnome;
then
if detect_xfce;
then
if detect_cinnamon;
then
if detect_mate;
then
if detect_lxde;
then
detect_sugar
fi
fi
fi
fi
fi
fi
fi
if [ "$1" == '-v' ];
then
echo $VERSION
else
if [ "$1" == '-n' ];
then
echo $DESKTOP
else
echo $DESKTOP $VERSION
fi
fi
ps -e | grep -E '^.* xfce4-session$' > /dev/null
(($? == 0)) && ...
GNOME Shell 3.26.2
我来说没有用UNKNOWN
。从没有输出gnome-session --version
工作对我来说是gnome-shell --version | awk '{print $3}'
我也没得到什么的ps -e | grep -E '^.* gnome-session$'
。这似乎是由于-b
末尾gnome-session-b
。删除$
作品或只是简单地ps -e | grep 'gnome-session'
。通过此更改,脚本可以正常工作。我得到GNOME 3.26.2
那可能取决于情况。如果您知道使用了哪个显示管理器,则可能是该信息将该信息放入环境变量中。
如果不是这种情况,那么我想您必须检查要识别的每个DE。它们都应该引入自己的环境变量。
echo ${DESKTOP_SESSION:0:1}
会成功?据我测试,它将返回u
Unity和x
XFCE。希望有些人会喜欢KDE和其他台式机。
echo ${DESKTOP_SESSION} kde-plasma-safe
用于我的KDE。为什么“安全” ...
如果环境变量XDG_CURRENT_DESKTOP
可用,它应该告诉您。
# echo $XDG_CURRENT_DESKTOP
KDE
您可以寻找正在运行的Xorg
进程。其父应该是您的显示经理。它的后代应指示正在运行的桌面环境。在我的系统上,显示管理器自行执行(使用不同的参数)。然后生成x-session-manager
与链接的xfce4-session
。这可能就足够了,但是所有这些子级都与我的桌面环境有关。通过进程树找到它们应该是排除由各种程序启动(或故意)启动的其他窗口系统元素的最佳方法。
我的第一个想法是,最好是找到与您的桌面环境相关联的窗口管理器,但是通常可以配置一个不同的窗口管理器来运行(例如,xmonad
在Gnome中),因此这并不可靠。要寻找的最好xfdesktop
的脚本可能是管理实际桌面的脚本,例如管理脚本实际需要的桌面环境元素:)
这是使用procps-ng的示例(-C
而--ppid
不是POSIX)。假设只是的一个实例Xorg
。
这只是适用于xfce桌面的示例。一个完整的工作示例需要调查每个桌面系统使用的过程,就像其他大多数解决方案都需要调查如何在各种其他桌面系统中设置环境变量一样。
X=Xorg
search_descendants ()
{
ps h -o comm --ppid $1 |
grep -E '^(xfdesktop|another_desktop_process)$' &&
return 0
for pid in $(ps h -o pid --ppid $1)
do
search_descendants $pid && return 0
done
return 1
}
dm_pid=$(ps h -o ppid -C "$X")
case "$(search_descendants $dm_pid)" in
xfdesktop)
desktop=xfce
;;
another_desktop_process)
desktop=another_desktop
;;
*)
desktop=unknown
;;
esac
echo $desktop
unknown
在Ubuntu上返回。
another_desktop
结果。
从众多评论中报告的所有实验中,我认为作为OP的职责是我要达成共识。(请放心,如果有对比数据可用,我很乐意复查此答案。)
就目前而言,最好是从$XDG_CURRENT_DESKTOP
定义此变量的时候开始。如果不是,则$XDG_DATA_DIRS
可以提供所需的信息,而不是的第一个字母${DESKTOP_SESSION:0:1}
。
XDG_CURRENT_DESKTOP
。我认为这些变量的主要问题在于变量是由显示管理器而不是桌面环境设置的,因此存在一些不一致之处。当我选择用lightdm默认会话(XFCE)echo $DESKTOP_SESSION
给出了lightdm-xsession
这是一个融合lightdm
和x-session-manager
,用于启动我的桌面(符号链接的过程xfce4-session
)。我想象使用不同的默认会话进行安装将仅使用不同的符号链接并产生相同的结果DESKTOP_SESSION
DESKTOP_SESSION
实际上说的xfce
还是gnome
这对Ubuntu 18.10(宇宙)[lxqt类型]和Mint 19(塔拉)[肉桂类型]均适用:
$ set | grep XDG_CURRENT_DESKTOP | tr '[:upper:]' '[:lower:]' | cut -d'=' -f2
将结果捕获到一个变量中,然后通过功能强大的分析逻辑(如果是/则为案例stmt)执行进一步的必要代码,其中包括来自那里的任何/所有已识别类型;和/或在使用无法识别的类型时正常运行。