最可靠方法是执行echo $xdg_current_desktop,因其由xdg标准定义、桌面会话启动时自动设置,不依赖进程、登录管理器或显示协议,常见输出如gnome、kde、xfce等;需在已登录图形界面的终端中运行。

直接看 $XDG_CURRENT_DESKTOP 就行,这是最可靠、最通用的方法,其他方式要么不准,要么要装额外工具。
为什么优先用 $XDG_CURRENT_DESKTOP
这个环境变量由桌面会话启动时自动设置,是 XDG 标准定义的权威标识。它不依赖进程是否存在、不依赖登录管理器类型(GDM3/SDDM/LightDM),也不受 Wayland/X11 切换影响。常见输出有:
-
GNOME或ubuntu:GNOME→ Ubuntu 默认 GNOME -
KDE→ KDE Plasma(Kubuntu) -
XFCE→ Xubuntu -
MATE→ Ubuntu MATE -
CINNAMON→ Linux Mint Cinnamon
注意:echo $XDG_CURRENT_DESKTOP 必须在已登录图形界面的终端中运行;SSH 远程连接且未转发 X11 时该变量为空。
$DESKTOP_SESSION 有时能用,但容易误导
这个变量值更偏向“会话名”,不是标准桌面环境标识。比如:
- Ubuntu 22.04+ 上常为
ubuntu,不代表 GNOME 版本或变体 - Kubuntu 可能是
plasma,但某些定制 ISO 会写成plasma5或default - 手动切换会话后可能残留旧值,不刷新
它适合快速排查是否进了某个会话,但不能作为判断 DE 类型的唯一依据。
靠 ps 查进程只能当备选
当你发现 $XDG_CURRENT_DESKTOP 为空(比如某些轻量级环境或故障会话),可以用进程辅助判断:
ps -e | grep -E "gnome-shell|plasmashell|xfce4-session|cinnamon-session|mate-session"- 看到
gnome-shell→ GNOME;plasmashell→ KDE Plasma;xfce4-session→ Xfce
但要注意:Wayland 下部分进程名不同(如 gnome-shell 仍存在,但 weston 或 hyprland 这类不是桌面环境);另外,如果用户同时开了多个桌面会话(比如嵌套 Xephyr),ps 可能返回多个匹配项,需结合 loginctl 确认当前活跃会话。
别用 neofetch 或 screenfetch 做第一判断
这两个工具确实好看又信息全,但它们内部仍是读取 $XDG_CURRENT_DESKTOP 或 fallback 到 ps + 启动脚本路径推断。问题在于:
- 需要先
sudo apt install neofetch,不是系统默认安装 - 某些最小化安装或容器环境压根没 GUI 工具链,
neofetch会报错或显示不全 - 它的版本号解析逻辑复杂,比如 GNOME 版本可能来自
gnome-shell --version,但该命令在某些 Snap 安装下不可用
真正需要版本号时,再单独调用对应命令更可控,比如 gnome-shell --version 或 plasmashell --version。
实际操作中,95% 的情况一条 echo $XDG_CURRENT_DESKTOP 就够了;剩下 5%,往往是桌面没正常启动或环境变量被覆盖——这时候查进程、看 ~/.xsession-errors 或重启显示管理器比换命令更有用。











