什么是Desktop Entry呢?中文可以称作「应用程序捷径」,它是构成Linux桌面环境的基本元素之一,以.desktop作为附文件名结尾。

很多Windows用户有这种经验吧,程序安装后会自动在桌面创建捷径,点一下就能够启动程序。删掉捷径,却不会删掉程序本体。Linux也有类似的东西,那就是Desktop Entry。

基本上,只要你有使用Linux桌面,每天都会看到各式各样的Desktop Entry图标。

title.webp

使用文件管理器查看Linux系统目录的Desktop Entry

大部分的Linux桌面环境都遵守Freedesktop.org制定的Desktop Entry标准,使之能显示在桌面上与用户交互。

下文Ivon简介Desktop Entry的用途,还有基本格式,搭配实例解说。

试想一下,你在桌面点一下启动Firefox图标,就会打开Firefox浏览器。而实际上你是通过位于/usr/share/applications/firefox.desktop的文件,间接启动背后的二进位档/usr/bin/firefox的。

为什么我们不要直接运行程序的二进位档就好了?通常Linux套件管理器安装软件的时候,会将二进位档放到系统目录,随之安装的还有Desktop Entry。接着桌面的应用程序列表/菜单便会显示该应用程序的图标。

Desktop Entry并非应用程序本体,它比较像是一个启动器,里面定义了启动应用程序的参数、桌面图标、右键菜单、多语言名称的信息。通过Desktop Entry,用户能够更直觉的启动软件,而不用频繁使用指令。

如果把通过Desktop Entry启动程序的过程绘制为图片,那么内容应该是长这样的:

1.webp

要是没有Desktop Entry,用户启动程序可能就得这样做:

2.webp

我们不是原始人!

Desktop Entry的标准,也能改善桌面环境彼此之间的互通性,以下内容摘自Freedesktop.org官网:

KDE Plasma 和 GNOME 桌面环境都采用了类似的格式来处理「桌面项目」,即用于描述特定程序如何启动、如何在菜单中显示等的配置文档。为了更广泛的社群利益,各方应达成统一标准,这样不仅可以简化这两个环境之间的互通性,还能让任何实施该规范的额外环境更容易兼容。

基本上GNOME和KDE Plasma都遵守Freedesktop.org提出的Deskop Entry标准,规定一个.desktop文件里面要有哪些项目。不过也有自家另外定义的标准,这端看应用程序开发者要不要支持了。

XFCE、Cinnamon、LXQT等其他桌面理应也遵守Desktop Entry标准。

2. Desktop Entry会用在什么地方?

  1. 几乎每个图形化程序都会在套件安装后自动创建Desktop Entry,让用户可以点击图标启动。

例如GNOME的应用程序列表,上面的图标全都是Desktop Entry。

gnome.webp

还有KDE Plasma的应用程序列表,会依照Desktop Entry文件定义的应用程序类别进行分类。

kde.webp

当然,用户也可以自己添加Desktop Entry,启动特定的二进位档(binary)或者指令稿(script)。

  1. 允许用户传递不同的参数,修改应用程序启动后的行为。譬如,向Firefox传递-P "profile_name"参数,可以用不同的设置档启动Firefox。
  2. 将Desktop Entry放到桌面的话,即为添加桌面捷径。虽然Desktop Entry有捷径的功用,但它跟ln指令还是不一样的东西。
  3. 修改打开特定文件格式的缺省程序,参见XDG MIME Applications。不需要写死应用程序的二进位档路径,而是通过xdg-open指令,运行Desktop Entry,用特定的应用程序打开文件。Desktop Entry也能够定义该程序能用来打开哪些格式的文件。
  4. 让程序开机自动启动,参见XDG Autostart。Desktop Entry比较适合用来启动图形化程序,纯文本运行的建议用Systemd。

3. Desktop Entry有效路径

虽然Desktop Entry可以单独存在,想放在哪个路径都可以,但是若要显示在桌面环境,就必须放到指定位置。

认识「有效路径」的概念,放到这里的Desktop Entry,才会被桌面环境读取到,并显示在应用程序列表。

就以Ubuntu系统来说,Desktop Entry可能的目录有以下几个,才能够显示在桌面的应用程序列表:

  • /usr/share/applications → 系统套件管理员安装的程序
  • /usr/local/share/applications → 用户自行安装到系统目录的程序
  • ~/.local/share/applications → 用户安装到自身家目录的程序
  • /var/lib/flatpak/exports/share/applications → Flatpak套件
  • ~/.local/share/flatpak/exports/share/applications → Flatpak套件
  • /var/lib/snapd/desktop/applications → Snap套件

常用的是前三个。

4. Desktop Entry写法,以自订Firefox为例

Deskop Entry规定了应用程序的启动方式。通常套件管理器安装软件的时候会一并创建Desktop Entry。例如运行apt install firefox,从.deb档解出二进位档放到/usr/bin/firefox,并将Desktop Entry放到/usr/share/applications/firefox.desktop。然后桌面的应用程序列表就会显示Firefox。

正如我上面说的,用户可以编辑现有的Desktop Entry,或者新创一个。老实说,编辑现有的Desktop Entry不是很建议的作法,因为很容易跟着系统更新而被套件管理器覆盖掉。比较好的方法是拷贝一份,或者从头写一个Desktop Entry。

比如,我想要创建一个启动Fifrefox后以personal设置档启动的Desktop Entry,那么我就得先拷贝一个Desktop Entry,接着修改内容。

  1. 运行firefox -P指令,添加一个叫做personal的Firefox设置档。
  2. 将Firefox的Desktop Entry拷贝到用户目录,创建一个firefox-custom.desktop文件。我这里拷贝到~/.local/share/applications/是要让它能够显示在桌面的应用程序列表。你也可以把它拷贝到~/Desktop,只显示在桌面。
cp /usr/share/applications/firefox.desktop \
~/.local/share/applications/firefox-custom.desktop
  1. 编辑firefox-custom.desktop里面的内容。
vim ~/.local/share/applications/firefox-custom.desktop
  1. 如何修改Desktop Entry呢?实际上Freedesktop.org定义的可以用的选项很多,讲几个比较重要的。下表标示「必要」的项目表示Deskop Entry必须含有该键值。
用途必要
VersionDeskp Entry标准的版本,不是应用程序版本。虽然不是必要项目,但还是建议注明
Type决定这个是应用程序(Application)、网页链接(Link)还是目录(Directory)。本文只讨论Application的用法
Name显示的应用程序名称。后面加上[语言代码]用于支持多语言显示,没有的话就是显示缺省语言的名称
GenericName通用应用程序名称,GNOME不会显示此信息,但KDE Plasma会在应用程序名称下方显示。后面加上[语言代码]用于支持多语言显示,没有的话就是显示缺省语言的名称。
Keywords关键字,便于用户搜索。后面加上[语言代码]用于支持多语言显示
Exec要运行的程序指令,通常是写出二进位档或者指令稿的绝对路径,因为你没办法保证每个发行版的$PATH都一样
Path程序工作目录
Terminal是否在终端机里面运行程序
NoDisplay是否要从应用程序列表隐藏。
Comment注解。即鼠标移到应用程序图标上会短暂显示的工具提示框。
Icon图标路径,遵守Icon Theme标准,缺省应该是位于/usr/share/icons/,也可以直接写路径。
Actions可运行的操作,也就是用户在桌面对应用程序图标按右键会显示的菜单。先用Actions=声明有哪些操作,再通过[Desktop Action 动作名称]区块的方式来定义操作背后运行的指令。
MimeType表示应用程序能打开哪些文件格式
Categories应用程序分类,GNOME不会显示,KDE Plasma会自动分类到不同菜单下面。
StartupWMClass启动的窗口类别
StartupNotify启动时是否显示通知

#开头的行数是注解。

[ ]包起来的是一个区块。

所有的键值用Key=Value的方式表示。

如果要设置环境变量,使用env,譬如Exec=env MOZ_ENABLE_WAYLAND=1 firefox %u

  1. 查看/usr/share/applications/firefox.desktop,Firefox的Desktop Entry就符合了上面所说的内容。
[Desktop Entry] # 这一个区块是Desktop Entry的基本信息
Version=1.0
Type=Application # 应用程序
Exec=firefox %u # 点击后会运行的指令
Terminal=false # 不要打开终端机
Icon=firefox # 图标
StartupWMClass=firefox # 启动的窗口类别
Categories=GNOME;GTK;Network;WebBrowser; # 应用程序分类
MimeType=application/json;application/pdf;application/rdf+xml;application/rss+xml;application/x-xpinstall;application/xhtml+xml;application/xml;audio/flac;audio/ogg;audio/webm;image/avif;image/gif;image/jpeg;image/png;image/svg+xml;image/webp;text/html;text/xml;video/ogg;video/webm;x-scheme-handler/chrome;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/mailto; # Firefox可以用来打开的文件格式
StartupNotify=true # 启动时显示通知
Actions=new-window;new-private-window;open-profile-manager; # 右键操作,下面才写出具体运行指令
Name=Firefox # 多语言应用程序名称
Name[zh_CN]=Firefox
Name[zh_TW]=Firefox
Comment=Browse the World Wide Web # 鼠标移到图标上短暂显示的工具提示框
Comment[zh_CN]=浏览万维网
Comment[zh_TW]=浏览万维网
GenericName=Web Browser
GenericName[zh_CN]=Web 浏览器
GenericName[zh_TW]=网页浏览器
Keywords=Internet;WWW;Browser;Web;Explorer; # 搜索关键字
Keywords[zh_CN]=Internet;WWW;Browser;Web;Explorer;
Keywords[zh_TW]=互联网;网络;浏览器;网页;上网;Internet;WWW;Browser;Web;Explorer;

[Desktop Action new-window] # 按右键会显示的操作
Exec=firefox --new-window %u
Name=New Window
Name[zh_CN]=新建窗口
Name[zh_TW]=开新窗口

[Desktop Action new-private-window] # 按右键会显示的操作
Exec=firefox --private-window %u
Name=New Private Window
Name[zh_CN]=新建隐私窗口
Name[zh_TW]=开新隐私窗口

[Desktop Action open-profile-manager] # 按右键会显示的操作
Exec=firefox --ProfileManager
Name=Open Profile Manager
Name[zh_CN]=打开配置文档管理器
Name[zh_TW]=打开设置档管理员
  1. 那要从何改起呢?观察一下得知,只要修改Name=Exec=的内容,就够做出一个自订启动器了。考虑到这只是一个简单的捷径,所以我将fireofx-custom.desktop其他的键值全部省略,精简成如下内容。
[Desktop Entry]
Version=1.0
Type=Application
Name=Firefox 以Personal设置档启动
Categories=GNOME;GTK;Network;WebBrowser;
Exec=firefox -P "personal"
Icon=firefox
  1. 尝试重新登录桌面,便会在应用程序列表看到两个Firefox了。

Screenshot_20250323_183301.webp