Skip to content

17 启动器

Linux 的设计哲学是,一切皆文件。在菜单或任务栏、桌面上点开一个应用程序的图标,这个程序就运行了。你有没有想过这个图标实际上是什么呢?没错,就是一个 .desktop 文件,也称启动器(Launcher)

部分桌面环境的菜单还对应用程序分了类,如下图所示,真的是非常体贴!WPS 还比较“霸道”地设置了自己的专属分类。可是有的分类我并不认同,可以修改吗?这就涉及 .desktop,.directory 和 .menu 文件之间的互动了。

Cinnamon菜单

GNOME菜单

这一切都遵循 FreeDesktop 标准

为什么要了解启动器

了解这些有什么用呢?原因太多了,除了上面的案例,我还可以举两个例子。

第一个例子是,你可以点开某个应用程序,但不知道运行这个应用程序的命令。有的桌面环境提供了如下图所示的便捷方法。

Cinnamon提供程序命令名称

Cinnamon提供程序命令名称

但另一些桌面环境,比如 GNOME,没有提供这一途径,不了解启动器的话,恐怕只能靠英语水平猜测、查找文件来验证了吧!

第二个例子,Geogebra,是一个免安装软件,针对 Linux 平台只提供了 .tar.gz 这样的压缩包,如何不需要进入压缩包目录就能运行 Geogebra,并且点开一个图标也能运行呢?就像是“安装”了一样。本页面将针对这个场景进行探讨。

假设这个压缩包被解压成了 Geogebra 目录,第一个问题不需要启动器就能解决,有如下两种方式:

  1. 系统级安装
    bash
    sudo mv Geogebra /opt/
    sudo ln -s /opt/Geogebra/geogebra /usr/bin/geogebra
  2. 用户级安装
    bash
    sudo mv Geogebra ~/.local/share/
    sudo ln -s ~/.local/share/Geogebra/geogebra ~.local/bin/geogebra

第二个问题呢?那就要使用启动器了。

用户级设置会覆盖系统级设置,相当于一个符合用户特定需求的补丁。这一点不仅仅是在启动器的设置,在任何方面的设置都适用。

.desktop

系统级路径用户级路径
/usr/share/applications/xx.desktop~/.local/share/applications/xx.desktop
bash
[Desktop Entry]
Name=Geogebra Classic 5
Comment=Dynamic Math Software
Comment[zh_CN]=动态数学软件
Exec=geogebra
Icon=geogebra
Type=Application
Categories=Education;
StartupNotify=true
Keywords=Run;

必选字段:

字段名说明示例值
Type文件类型,常用值:
- Application:应用程序
- Link:URL 链接
- Directory:文件夹
Type=Application
Name应用程序名称Name=文本编辑器
Exec启动命令,支持参数占位符。可识别PATH环境变量Exec=gedit %F
Icon图标名称或路径。若图标在系统图标主题中,直接填名称(无需扩展名);路径填绝对路径或相对于/usr/share/icons/的路径。Icon=geditIcon=/path/icon.png

可选字段:

字段名说明示例值
Comment简短描述Comment=GNOME 文本编辑器
Terminal是否在终端中运行,true/false(默认 falseTerminal=false
Categories应用程序分类,决定启动器在哪个菜单,需符合 Freedesktop 规范Categories=Utility;TextEditor;Development;
Keywords搜索关键词(空格分隔),提升桌面环境搜索可发现性Keywords=text;edit;note;
NoDisplay是否在菜单中隐藏(true 表示仅后台使用,不显示)NoDisplay=false

.directory

系统级路径用户级路径
/usr/share/desktop-directories/xx.directory~/.local/share/desktop-directories/xx.directory
ini
[Desktop Entry]
Name=Education
Name[zh_CN]=教育
Icon=applications-education
Type=Directory

到这里你会觉得奇怪, .desktop 和 .directory 还没有任何关联,我怎么把 Geogebra 放在“教育”下面呢?这就需要 .menu 文件了。

不仅是 .desktop 和 .directory 之间的桥梁,还可以设置每个 .desktop 和 .directory 的显示与否,是靠匹配模式实现的。

系统级路径用户级路径
/etc/xdg/menus/xx.menu~/.config/menus/xx.menu
xml
<Menu>
  <Name>Education</Name>
  <Directory>cinnamon-education.directory</Directory>
  <Include>
    <Category>Education</Category>
  </Include>
</Menu>
  • <Directory> 指定用哪个 .directory 文件来显示这个菜单项(提供名称、图标等展示信息)
  • <Include> 指定哪些 .desktop 会被归入这个.menu<Category>Education</Category>匹配 CategoriesEducation 的启动器。还可以通过 <FileName> 指定特定的启动器,用<And><Not> 等逻辑运算。与 <Include> 同级、作用相反的键是 <Exclude>