随着 Linux 的不断发展壮大,除了其在原有的命令行阵地依旧保持既有特色外,桌面 Linux 发展也相当迅猛。在 Linux 系统安装程序后,在桌面环境或菜单中添加该程序的快捷方式,无疑也是高效简洁的程序启动方式。
现代各个 Linux 桌面发行版均考虑了这一问题,在文件系统的特定目录内(如 /usr/share/applications/
)中统一放置程序的快速启动方式的文件。这些文件以 .desktop 结尾,采用一系列专门的规范(如 Desktop Entry Specification)规定了文件的编写格式,其中涵盖了程序快捷启动方式的相关信息。新安装的某个应用程序除了可以通过命令行启动外,还期望采用桌面或菜单创建快捷方式启动,则在专门的文件夹(如 /usr/share/applications/
)中编辑相应的 .desktop 快捷可执行文件即可。
desktop 文件存储位置
与其他多用户操作系统一样,Linux 既可进行全局性配置,也可进行某个特定用户的定制化配置,Linux 的桌面快捷启动文件也具备这一特点,使用不同的目录位置表示不同的配置方式。
目录位置 | 说明 |
---|---|
/usr/share/applications/ |
全局配置路径(发行版默认路径) |
/usr/local/share/applications/ |
第三方应用配置路径 |
~/.local/share/applications/ |
特定用户本地化配置路径 |
除了上述位置外,不同 Linux 发行版可能会定义其他额外的桌面文件路径。可使用查询指令找到系统中所有的 desktop 文件及其路径,
sudo find / -name "*.desktop"
desktop 文件编写规范
desktop 文件本质上可视为一个配置文件,采用的常见的 “key – value” 配置方式。其具体的规范如下:
[Desktop Entry]
Version = 1.0
Encoding = UTF-8
Name = Eclipse
GenericName = Eclipse
Comment = An IDE for Java and C/C++
Exec = /usr/local/eclipse/eclipse
Icon = /usr/local/eclipse/icon.xpm
Terminal = false
Type = Application
Categories = GNOME;Application;Development;
Name[zh_CN] = Eclipse
Comment[zh_CN] = 一款开发Java和C/C++的集成环境
GenericName[zh_CN] = Eclipse
各主要字段的含义:
- [Desktop Entry] — 最顶层字段
桌面快捷方式文件的标识,必不可少。
-
Version [可选]
指明了当前 Desktop Entry 文件所遵循的 Desktop Entry 文件标准版本。
-
Encoding [1.0 版本不推荐使用]
指定了当前 Desktop Entry 文件中特定字符串所使用的编码方式。尽管 Desktop Entry 文件标准 1.0 不再推荐使用该关键字,但由于历史原因该关键字仍然广泛出现在现有的 Desktop Entry 文件中。
-
Name [必选] — 应用程序名称
指定了相关应用程序的名称。
-
GenericName [可选]
指定了相关应用程序的通用名称。
-
Comment [可选]
对当前应用程序的注释(commnet)。在出现应用程序图标的地方(如菜单、App Launcher 等),除了显示应用程序名称以外,往往会紧跟着一行对应用程序的解释说明文字,显示的即为 Comment 字段中的内容。
-
Type [必选] — 重要字段!
定义了 Desktop Entry 文件的类型。
常见的 “Type” 数值是 “Application” 和 “Link”。
- Type = Application:标识当前 Desktop Entry 文件指向了一个应用程序
- Type = Link:标识当前 Desktop Entry 文件指向了一个 URL (Uniform Resource Locator)
- Exec [可选]
前置条件:取决于
Type
字段。在Type = Application
时,Exec 字段才有意义。Exec 字段定义了启动指定应用程序所要执行的命令。
本例中,”Exec” 字段的数值是字符串
/usr/local/eclipse/eclipse
。在 shell 中输入该字符串并按回车键同样可以启动指定应用程序。此外,Exec 字段可以通过命令中携带的参数,说明程序的打开方式。常用参数有:
参数 说明 %f 单个文件名,即使选择了多个文件。如果已选择的文件不在本地文件系统中(比如说在 HTTP 或者 FTP 上),这个文件将被作为一个临时文件复制到本地,%f 将指向本地临时文件 %F 文件列表。用于程序可以同时打开多个本地文件。每个文件以分割段的方式传递给执行程序。 %u 单个URL。本地文件以文件URL或文件路径的方式传递。 %U URL列表。每个URL以分割段的方式传递给执行程序。本地文件以文件URL或文件路径的方式传递。 尤其是,Exec 字段最后的包含 %U 或 %f 参数时,决定了这个程序是否能显示在文件管理器的 open with 清单中。
-
URL [可选]
前置条件:取决于
Type
字段。在Type = Link
时,URL 字段才有意义。URL 字段的取值定义了该 Desktop Entry 文件指向的 URL。
-
Icon [可选] — 程序图标
定义当前 Desktop Entry 文件在应用程序浏览器或是在文件浏览器中所显示的图标文件位置。
大多数程序将快捷启动程序的图标放在系统默认放置路径
/usr/share/pixmaps
、/usr/share/icons
中。- 如果 Icon 字段的取值是以绝对路径的格式给出,那么其取值所指定位置的图标文件将被使用;
- 反之,Linux 系统按照 “Icon Theme Specification” 规范要求,在系统默认的图标目录下,定位所需要使用的图标文件。
- Terminal [可选] — 程序执行时是否显示终端窗口
前置条件:取决于
Type
字段。在Type = Application
时,Terminal 字段才有意义。Terminal 字段的取值指出了相关应用程序(即 “Exec” 字段指出的命令)是否需要在终端窗口中运行。
该字段的取值是布尔值(true 或 false)。
-
菜单相关
- Categories [可选] — 程序属于菜单中的哪个大类
前置条件:取决于
Type
字段。在Type = Application
时,Categories 字段才有意义。本字段指出了相关应用程序在菜单中显示的类别。更直观的表述,该选项指明了应用程序在菜单显示的哪一个大类中出现。
比如,本例中将 eclipse 分类在 “应用程序->编程” 子菜单中。具体菜单分类由规范 “Desktop Specification Menu” 具体定义。
-
NoDisplay [可选] — 程序的快捷启动是否在菜单中出现
NoDisplay 选项的含义是: “该应用程序存在,但是,该应用程序不在菜单中显示”。
这是一个非常有意思的选项,同时也是一个非常有用的选项。有些情况下,我们期望使用一些 “隐式” 的应用程序,这类程序在菜单选项中没有明确的入口,非常“低调”;与此同时,这些程序又与特定的 MIME 类型关联,因此,该 MIME 类型的文件在文件管理器或其应用中可以被”隐式”应用程序打开。该选项为创建此类的 “隐身” 的应用程序提供了途径。
有些很多功能强大的应用程序,会提供各种参数,以便在不同场景使用。在特定场景下,使用带有特定参数配合的应用程序,这种情况如果都出现在菜单中,会使用户感到非常的混乱,如此,只有一个通用场景下应用程序出现在菜单中,作为常规 “门面”,而使用 “隐式” 应用程序作为 “门面” 的 “影子”,可以很好的满足各类多样性场景的需求。
“隐式” 应用程序真正做到了 “润物细无声”,在 linux 桌面应用中,很多大型的应用软件使用这个选项,虽有多个快捷启动方式,但只安排一个用户可见的 “门面”。如,在 crossover 中安装 office,就会创建大量的 “隐式” desktop 应用。
- Categories [可选] — 程序属于菜单中的哪个大类
-
MimeType [可选] — 程序打开文件类型
说明该程序支持的 MIME 文件类型。
一个应用程序可以支持多个 MIME 类型,每个类型之间用双引号隔开。
MimeType=application/postscript;application/pdf;
- OnlyShowIn 和 NotShowIn [可选]
分别定义了当前 Desktop Entry 是否在特定 Linux 桌面系统(如 Linux GNOME 或 Linux KDE)下显示(由”OnlyShowIn”定义),或不显示(由”NotShowIn”定义)。
desktop 文件管理工具
desktop 文件是一个文本文件,实际使用时,按照 Desktop Entry Specification 规范进行编辑,并存储到上述的系统指定位置,即可在菜单中找到相关应用程序。除此之外,还可以拷贝至桌面或锁定至任务栏来使用 desktop 文件。
为提升 desktop 文件的管理效率,Linux 也提供配套的工具包 — desktop-file-utils。
deskotp-file-utils 中包含了几个重要的工具,方便 .desktop 文件的管理,
作用 | 命令 |
---|---|
编辑 desktop 文件 | desktop-file-edit |
验证 desktop 文件 | desktop-file-validate |
安装 desktop 文件 | desktop-file-install |
更新 desktop 文件数据库 | update-desktop-database |
desktop 文件调试
很多应用场景下,为提高使用效率,往往需要自行编写 desktop 文件。此时,高效调试 desktop 文件显得尤为重要,整体上可分为两个步骤,
- 确保应用程序在命令行成功运行;
- 将应用程序及其参数赋值给 desktop 文件的 Exec 字段并调试;
desktop 文件调试的核心是 Exec 字段的正确赋值,Exec 字段设置不正确,通过图标往往无法启动应用程序。
使用 desktop-file-validate
一个 desktop 文件编写完成后,可先使用验证工具 desktop-file-validate
自动检查 desktop 文件中各个字段的 “基本语法错误”。desktop-file-validate
可作为 desktop 文件的基线检查。
desktop-file-validate app.desktop
开启 terminal 进行调试
先设置 Terminal 字段为 true,进行调试,确保在 bash 情况下,程序能正常启动后,逐步调试关闭 terminal(即 Terminal=false)。
检查程序或脚本的路径设置
desktop 文件调试的核心是 Exec 字段的正确赋值,而 Exec 正确赋值的核心是需运行的程序或脚本的路径的正确设置,路径错误是 desktop 文件编写中的最常见问题。
一个精简的 desktop 文件模板如下所示:
[Desktop Entry]
Encoding = UTF-8
Name = your_app_name
Type = Application
Exec = /usr/local/eclipse/eclipse 或 sh /home/gogetter/myscripts/vm-xpsp3.sh
Icon = /usr/local/eclipse/icon.xpm
Terminal = false
在 Exec 中指定执行程序/脚本路径,路径应使用完整路径,不能使用 ~ 等简化形式。
如果在 Exec 中使用了脚本,脚本中调用的命令也要使用完整路径。
波浪线(~)是 Bash 程序内置的变量符号,在 Bash 这个程序运行时,Bash 会自动将其(~)替换为 HOME 环境变量,进而形成完整的路径。但桌面环境执行时,不在 Bash 的程序环境中,如果使用 ~,不会自动将其替换为 $HOME 中的值,如此会造成程序或脚本的准确存储位置无法找到的情况。故而,desktop 文件中,宜使用完整路径。
创建包装脚本
将复杂的多参数程序包装成无参数的脚本,赋值给 Exec 字段。如,
创建 start-app.sh:
#!/bin/bash
java -jar /path/to/your/app.jar
使脚本可执行:
chmod +x start-app.sh
.desktop 文件:
Exec=/path/to/start-app.sh
使用日志文件
在 Exec 字段中,通过设置日志文件收集程序运行反馈结果,通过日志信息排查问题。例如,
[Desktop Entry]
Name=Debug Launcher
Exec=sh -c 'echo "Desktop File Debug" > /tmp/debug.log; env >> /tmp/debug.log; /your/real/command >> /tmp/debug.log 2>&1'
Icon=dialog-warning
Terminal=true
Type=Application
Categories=Utility;
上述实例中,通过 /tmp/debug.log
文件收集程序运行环境变量信息,并记录程序执行的日志信息。
Reference
- https://zhuanlan.zhihu.com/p/49837675
- https://www.polarxiong.com/archives/Bash%E6%98%AF%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E6%B3%A2%E6%B5%AA%E7%BA%BF%E7%9A%84.html
- https://blog.csdn.net/astrotycoon/article/details/78109809
- https://www.cyberciti.biz/howto/how-to-install-and-edit-desktop-files-on-linux-desktop-entries/
- Linux上的文件类型与默认图标