什么是Desktop Entry呢?中文可以称作「应用程序捷径」,它是构成Linux桌面环境的基本元素之一,以.desktop
作为附文件名结尾。
很多Windows用户有这种经验吧,程序安装后会自动在桌面创建捷径,点一下就能够启动程序。删掉捷径,却不会删掉程序本体。Linux也有类似的东西,那就是Desktop Entry。
基本上,只要你有使用Linux桌面,每天都会看到各式各样的Desktop Entry图标。
使用文件管理器查看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启动程序的过程绘制为图片,那么内容应该是长这样的:
要是没有Desktop Entry,用户启动程序可能就得这样做:
我们不是原始人!
Desktop Entry的标准,也能改善桌面环境彼此之间的互通性,以下内容摘自Freedesktop.org官网:
KDE Plasma 和 GNOME 桌面环境都采用了类似的格式来处理「桌面项目」,即用于描述特定程序如何启动、如何在菜单中显示等的配置文档。为了更广泛的社群利益,各方应达成统一标准,这样不仅可以简化这两个环境之间的互通性,还能让任何实施该规范的额外环境更容易兼容。
基本上GNOME和KDE Plasma都遵守Freedesktop.org提出的Deskop Entry标准,规定一个.desktop文件里面要有哪些项目。不过也有自家另外定义的标准,这端看应用程序开发者要不要支持了。
XFCE、Cinnamon、LXQT等其他桌面理应也遵守Desktop Entry标准。
2. Desktop Entry会用在什么地方?
- 几乎每个图形化程序都会在套件安装后自动创建Desktop Entry,让用户可以点击图标启动。
例如GNOME的应用程序列表,上面的图标全都是Desktop Entry。
还有KDE Plasma的应用程序列表,会依照Desktop Entry文件定义的应用程序类别进行分类。
当然,用户也可以自己添加Desktop Entry,启动特定的二进位档(binary)或者指令稿(script)。
- 允许用户传递不同的参数,修改应用程序启动后的行为。譬如,向Firefox传递
-P "profile_name"
参数,可以用不同的设置档启动Firefox。 - 将Desktop Entry放到桌面的话,即为添加桌面捷径。虽然Desktop Entry有捷径的功用,但它跟ln指令还是不一样的东西。
- 修改打开特定文件格式的缺省程序,参见XDG MIME Applications。不需要写死应用程序的二进位档路径,而是通过
xdg-open
指令,运行Desktop Entry,用特定的应用程序打开文件。Desktop Entry也能够定义该程序能用来打开哪些格式的文件。 - 让程序开机自动启动,参见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,接着修改内容。
- 运行
firefox -P
指令,添加一个叫做personal的Firefox设置档。 - 将Firefox的Desktop Entry拷贝到用户目录,创建一个
firefox-custom.desktop
文件。我这里拷贝到~/.local/share/applications/
是要让它能够显示在桌面的应用程序列表。你也可以把它拷贝到~/Desktop
,只显示在桌面。
cp /usr/share/applications/firefox.desktop \
~/.local/share/applications/firefox-custom.desktop
- 编辑
firefox-custom.desktop
里面的内容。
vim ~/.local/share/applications/firefox-custom.desktop
- 如何修改Desktop Entry呢?实际上Freedesktop.org定义的可以用的选项很多,讲几个比较重要的。下表标示「必要」的项目表示Deskop Entry必须含有该键值。
键 | 用途 | 必要 |
---|---|---|
Version | Deskp 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
- 查看
/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]=打开设置档管理员
- 那要从何改起呢?观察一下得知,只要修改
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
- 尝试重新登录桌面,便会在应用程序列表看到两个Firefox了。