Linux Desktop Entry

Linux Desktop Entry 文件深入解析

 

1.Desktop Entry 文件标准简介

在 Windows 平台上,用户可以通过点击位于桌面或菜单上的快捷方式轻松打开目标应用程序。现代 Linux 桌面系统也提供了此项功能。目前,Linux KDE 和 Linux GNOME 桌面系统都使用 Desktop Entry 文件标准来描述程序启动配置信息。Desktop Entry 文件标准是由 FreeDesktop.org(http://freedesktop.org/wiki/) 制定的,目前最新的版本是"Desktop Entry Specification 1.0"[1]。


2.Desktop Entry文件


图1 Linux GNOME 应用程序浏览器
图1  Linux GNOME 应用程序浏览器

Desktop Entry 文件以".desktop"为后缀名。以 Linux GNOME 桌面系统为例,用户打开应用程序浏览器后(见图1)会看见很多应用程序快捷方式。事实上,每个应用程序快捷方式都和一个 Desktop Entry 文件相对应。这些 Desktop Entry 文件通常被存放在 /usr/share/applications/ /opt/gnome/share/applications/ 等目录下。从文件浏览器进入这些目录,点击相应的 Desktop Entry 文件同样可以启动相对应的应用程序。

假设当前"/usr/share/applications/"目录下有一文件"cbt.desktop",用任意文件编 辑软件(如 vi 或 gedit)打开"cbt.desktop",将得到如下内容:


清单1 "cbt.desktop"文件内容

[Desktop Entry]
Version = 1.0
Encoding = UTF-8
Name = Quick Start Tour
GenericName = User Tutorial
Comment = Computer Based Training tutorial to /
guide and help you learn how to use the Desktop
Exec =
gnome-open /usr/share/doc/manual/sled-gnome-cbt_en/index.html
Icon = cbt
StartupNotify = true
Terminal = false
Type = Application
Categories = GNOME;Application;Documentation;
OnlyShowIn = GNOME;
X-SuSE-translate = true
Name[cs] = Rychlá prohlídka systému
Comment[cs] = V?ukov? program seznamující u?ivatele
se základy pracovního prost?edí
GenericName[cs] = U?ivatelsk? tutoriál
Name[hu] = Rendszerbemutató
Comment[hu] = A munkaállomés használatát bemutató segédlet
GenericName[hu] = Felhasználói segédlet


本文将在下一节中结合上述"cbt.desktop"文件内容重点解析 Desktop Entry 的文件结构。读者可以从中深入领会上述各条语句的具体含义。


3.Desktop Entry 文件结构

Desktop Entry 文件通常以字符串"[Desktop Entry]"开始。由清单 1 可以得知,Desktop Entry 文件的内容是由若干{关键字,数值}配对的 Entry 组成的。例如,"Version"就是一个关键字,关键字"Version"对应的数值是"1.0"。Desktop Entry 文件标准定义了一系列标准关键字。标准关键字分为必选和可选两种:必选标准关键字必须在 .desktop 文件中被定义;而可选关键字则不必。以下是对重点关键字的解析。

  • 关键字"Version":[可选] 该数值指定了当前 Desktop Entry 文件所遵循的 Desktop Entry 文件标准版本。
  • 关键字"Encoding":[1.0 版本不推荐使用] 该数值指定了当前 Desktop Entry 文件中特定字符串所使用的编码方式。尽管Desktop Entry 文件标准 1.0 不再推荐使用该关键字,但由于历史原因该关键字仍然广泛出现在现有的 Desktop Entry 文件中。
  • 关键字"Name":[必选]
    该数值指定了相关应用程序的名称。比如在清单1中关键字"Name"的数值是"Quick Start Tour"。打开文件浏览器,进入"/usr/share/applications"目录,就可以看见"cbt.desktop"文件所定义的快捷方式 的显示样式,如图2所示。其中,快捷方式的显示名称由关键字"Name"的数值所决定,快捷方式所使用的图标由下文中将要介绍的关键字"Icon"的数值 来决定。当然,这些定义在应用程序浏览器中同样适用,请参考图3。

    图2 "cbt.desktop"文件在文件浏览器中的显示样式
    图2  cbt.desktop 文件在文件浏览器中的显示样式


  • 关键字"GenericName":[可选]
    该数值指定了相关应用程序的通用名称。比如在清单1中关键字"GenericName"的数值是"User Tutorial"。打开应用程序浏览器,就可以看见字符串"User Tutorial"被显示在图标的右侧,如图3所示:


    图3 "cbt.desktop"文件在应用程序浏览器中的显示样式

    图3  cbt.desktop 文件在应用程序浏览器中的显示样式


  • 关键字"Comment":[可选]
    该数值是对当前Desktop Entry的简单描述。
  • 关键字"Type":[必选]
    关键字"Type"定义了Desktop Entry文件的类型。常见的"Type"数值是"Application"和"Link"。"Type = Application"表示当前Desktop Entry文件指向了一个应用程序;而"Type = Link"表示当前Desktop Entry文件指向了一个URL (Uniform Resource Locator)。
  • 关键字"Exec":[可选]
    关键字"Exec"只有在"Type"类型是"Application"时才有意义。"Exec"的数值定义了启动指定应用程序所要执行的命令,在此命令 是可以带参数的。在本例中,关键字"Exec"的数值是字符串"gnome-open /usr/share/doc/manual/sled-gnome-cbt_en/index.html"。在shell中输入该字符串并按回车键同样 可以启动指定应用程序。
  • 关键字"URL":[可选]
    关键字"URL"只有在"Type"类型是"Link"时才有意义。"URL"的数值定义了该Desktop Entry文件指向的URL。例如:

    清单2 "Type = Link"类型Desktop Entry文件示例


    Type = Link
    URL = http://www.ibm.com/developerworks


    双击含有上述内容的Desktop Entry文件将启动web浏览器,并打开指定网页"
    http://www.ibm.com/developerworks ", 运行结果请参考图4。
  • 关键字"Icon":[可选]
    该数值定义了当前Desktop Entry文件在应用程序浏览器或是在文件浏览器中所显示的图标。如果关键字"Icon"的数值是以绝对路径的格式给出,那么其数值所指定图标文件将被使 用;反之,Linux系统将使用"Icon Theme Specification"[2]在系统指定图标目录下定位所需要使用的图标文件。比如在本例中关键字"Icon"的数值是"cbt",它实际对应着系 统指定图标目录下的图片文件"cbt.png"cbt.png 。该图片作为图标的显示效果如图2,图3所示。
  • 关键字"StartupNotify":[可选]
    关键字"StartupNotify"的数值是布尔值(true 或是 false)。该关键字只有在"Type"类型是"Application"时才有意义。其数值的含义由规范"Startup Notification Protocol Specifications"[3]定义,在此不再详述。
  • 关键字"Terminal":[可选]
    和"StartupNotify"一样,关键字"StartupNotify"的数值也是布尔值,并且该关键字只有在"Type"类型 是"Application"时才有意义。其数值指出了相关应用程序(即关键字"Exec"的数值)是否需要在终端窗口中运行。本文将在下一节中给出关键 字"Terminal"的具体使用方法。
  • 关键字"Categories":[可选]
    关键字"Categories"只有在"Type"类型是"Application"时才有意义。"Categories"的数值指出了相关应用程序在菜 单中显示的类别。具体菜单分类由规范"Desktop Specification Menu"具体定义[4]。
  • 关键字"OnlyShowIn"和"NotShowIn":[可选]
    这两个关键字分别定义了当前Desktop Entry是否在特定Linux 桌面系统(例如:Linux GNOME 或 Linux KDE)下显示(由"OnlyShowIn"定义),或不显示(由"NotShowIn"定义)。具体定义请参考"Desktop Specification Menu"[4]。
  • 关键字"X-SuSE-translate":[SUSE Linux特有]
    关键字"X-SuSE-translate"是SUSE Linux(http://www.novell.com/linux/ ) 特有的。"X-SuSE-translate"符合SUSE RPM Package风格。"X-SuSE-translate"数值表示是否要对关键字"Name"和"GenericName"进行翻译。详情请参 考"SUSE Package Conventions"[5]。
  • 本地化关键字"[LOCALE]"
    根据"Desktop Entry Specification"规范[1],在关键字后加上字符串"[LOCALE]"就可以对该关键字进行特定的本地化定义。"LOCALE"的合法取值 为:

    LOCALE= lang_COUNTRY.ENCODING@MODIFIER

    在此,域"_COUNTRY",".ENCODING"和"@MODIFIER"是可以被忽略的。当指定Desktop Entry文件被解析时,解析器应当根据当前POSIX locale来正确获取本地化的关键字数值。例如清单1就分别定义了在"cs"和"hu"语言环境下关键字"Name","Comment" 和"GenericName"的不同数值。
  • 其余关键字
    除了上述在清单1中出现的关键字外,"Desktop Entry Specification"还定义了"Hidden","TryExec","MimeType"等可选关键字。用户可以根据需要进行选取。

4.分析运行 Desktop Entry 文件

Desktop Entry文件是一种常见的Linux文件格式,很多Linux程序需要对该种文件提供支持。在此,本文给出分析运行 Desktop Entry 文件的基本编成思路。

4.1 分析 Desktop Entry 文件内容

操作 Desktop Entry 文件的第一步是获取文件的内容。假设有一 Desktop Entry 文件,其路径信息存储在变量 pPath 中:

const char* pPath;

下列代码将把该文件内容读入内存"buffer"中。


清单3 读取 Desktop Entry 文件内容


int file_size = 0;
char *file_contents = NULL;
char *buffer = NULL;

if( eel_read_entire_file ( pPath, &file_size, &file_contents ) == GNOME_VFS_OK )
{
buffer = (char *)g_realloc ( file_contents, file_size + 1 );
buffer[file_size] = '/0';
}
else
{
return 1;
}


获取 Desktop Entry 文件内容后,就可进一步分析文件内容。在此,分析的重点是获取关键字"Type","Exec"/"URL",以及"Terminal"的数值。首先定义 结构 DestopEntryType:


清单4 DestopEntryType 结构定义

enum DestopEntryType
{
Application, // Type = Application
Link, // Type = Link
Unknown
};


下列程序将提取关键字"Type","Exec"/"URL"和"Terminal"的数值,并把这些数值分别存储在变 量"type","uri"和"bTerminal"中。


清单5 获取关键字"Type","Exec"/"URL",以及"Terminal"数值

    

DestopEntryType type = Unknown;
char *uri = NULL;
bool bTerminal = false;

GnomeDesktopItem *desktop_file;

desktop_file = gnome_desktop_item_new_from_string( NULL, buffer, file_size,
(GnomeDesktopItemLoadFlags)0, NULL );
if ( !desktop_file )
{
g_free( buffer );
return 1;
}

const char *strType = gnome_desktop_item_get_string( desktop_file, "Type" );
if ( !strType )
{
g_free( buffer );
gnome_desktop_item_unref ( desktop_file );
return 1;
}

if ( 0 == strcmp( strType, "Application" ) ) //type = Application
{
const char *exec_str = gnome_desktop_item_get_string( desktop_file, "Exec" );
if( !exec_str )
{
g_free( buffer );
gnome_desktop_item_unref( desktop_file );
return 1;
}
uri = g_strdup( exec_str );
type = Application;

const char *strTerminal = gnome_desktop_item_get_string( desktop_file, "Terminal" );
if ( strTerminal )
{
if ( 0 == strcmp( "true", strTerminal ) )
bTerminal = true;
else
bTerminal = false;
}
}
else if(strcmp(strType, "Link") == 0) //type = Link
{
uri = g_strdup( gnome_desktop_item_get_string( desktop_file, "URL" ) );
type = Link;
}

g_free( buffer );
gnome_desktop_item_unref( desktop_file );


4.2 运行"Type = Application"类型Desktop Entry文件

有了关键字"Type","Exec"和"Terminal"的数值,就可如下运行Desktop Entry文件。


清单6 运行"Type = Application"类型Desktop Entry文件


if ( type == Application )
{
if( bTerminal )
eel_gnome_open_terminal_on_screen( uri, NULL );
else
eel_gnome_shell_execute_on_screen( uri, NULL);
g_free( uri );
return 0;
}


4.3 运行"Type = Link"类型Desktop Entry文件

有了关键字"Type","URL"和"Terminal"的数值,就可如下运行Desktop Entry文件。


清单7 运行"Type = Link"类型Desktop Entry文件


if ( type == Link )
{
gnome_url_show( uri, NULL );
g_free( uri );
return 0;
}



5.创建Desktop Entry文件实例

在这部分中,本文将给出创建Desktop Entry文件的两个具体实例。这两个实例的目标都是要创建自动访问IBM DeveloperWorks网站的快捷方式,具体运行结果如图4所示。这两个实例将使用不同的方法实现这一目标。第一个实例将创建的文件类型 是"Application"的Desktop Entry文件"VisitDeveloperWorks-Application.desktop";第二个实例将创建的文件类型是"Link" 的Desktop Entry文件"VisitDeveloperWorks-Link.desktop"。


图4 "VisitDeveloperWorks-Application.desktop" / "VisitDeveloperWorks-Link.desktop"运行结果
图4

5.1 创建"Type = Application"Desktop Entry文件实例

假设系统指定图标目录下存有图片文件"gaim.png"gaim.png 。如图5所示编辑文件"VisitDeveloperWorks-Application.desktop",并把结果存于"/usr/share /applications/"目录下。


图5 "VisitDeveloperWorks-Application.desktop"文件内容
图5

该文件的核心内容是将应用程序图标设置为"gaim.png"文件,将Desktop Entry文件的类型设置为"Application",并将应用程序所要执行的命令设置为"firefox http://www.ibm.com/developerworks"。编辑完成后,在文件浏览器和应用程序浏览器下(如图6所示)就可以看见该实例的 显示样式。


图6 "VisitDeveloperWorks-Application.desktop"文件在应用程序浏览器中的显示样式
图6

5.2 创建"Type = Link"Desktop Entry文件实例

对上述"VisitDeveloperWorks-Application.desktop"文件进行如图7所示的修改, 并将文件更名为"VisitDeveloperWorks-Link.desktop",保存于"/usr/share/applications/"目 录下。


图7 "VisitDeveloperWorks-Link.desktop"文件内容
图7

该文件的核心内容是将 Desktop Entry 文件的类型设置为"Link",并将 Desktop Entry 文件指向的 URL 设置为"http://www.ibm.com/developerworks"。编辑完成后,在文件浏览器下(如图8所示)就可以看见该实例的显示样 式。值得注意的是,由于该实例并不是一个应用程序,因此在应用程序浏览器下是看不到相应快捷方式的。


图8 "VisitDeveloperWorks-Link.desktop"文件在文件浏览器中的显示样式
图8


6.结束语

Desktop Entry文件是Linux KDE 和Linux GNOME桌面系统中标准的程序启动配置描述方式。本文对该文件格式的定义和应用进行了深入的探讨。欲求更详细的使用和编程信息,请查找相关参考文献。


参考资料

<think> 我们被要求回答关于在Linux系统中创建和使用.desktop快捷方式的问题。根据提供的引用,我们可以总结出创建.desktop文件的基本步骤和配置项。 创建.desktop文件的位置通常有两种: 1. 在用户桌面目录(如~/Desktop)创建,这样只对当前用户可见,且会显示在桌面上。 2. 在系统应用程序目录(如/usr/share/applications)或用户本地应用程序目录(如~/.local/share/applications)创建,这样会在应用程序菜单中显示。 引用中提到了几种创建方法: - 方法1:拷贝现有的.desktop文件到Desktop目录(引用[1])。 - 方法2:使用文本编辑器(如nano)创建.desktop文件(引用[2])。 - 方法3:在用户桌面目录或应用程序目录中手动创建并编辑.desktop文件(引用[3])。 另外,引用[4]提到了在.zshrc(或.bashrc)中设置自定义命令来启动程序,但这不是创建快捷方式,而是设置命令别名。 我们将重点放在创建.desktop文件上。 .desktop文件的基本结构: 一个典型的.desktop文件包含一个[Desktop Entry]节,以及多个键值对。常见的键包括: - Comment: 对快捷方式的描述 - Terminal: 是否在终端中运行(true/false) - Name: 快捷方式的显示名称 - Exec: 要执行的程序路径(可以带参数) - Icon: 图标的路径(可以是绝对路径,也可以是图标名称) - Type: 类型,通常是Application - Categories: 应用程序类别(如Development, Utility等) - Encoding: 编码(如UTF-8,但新标准中已不推荐使用) - StartupNotify: 是否启动通知(true/false) 步骤: 1. 确定创建位置: - 桌面快捷方式:在~/Desktop(或用户语言环境对应的桌面目录)创建,例如:~/Desktop/eclipse.desktop - 应用程序菜单快捷方式:在~/.local/share/applications(当前用户)或/usr/share/applications(所有用户,需要root权限)创建 2. 创建文件: 在终端中使用文本编辑器创建,例如: ```bash nano ~/Desktop/eclipse.desktop ``` 3. 编辑文件内容,例如: ``` [Desktop Entry] Name=Eclipse Comment=Eclipse IDE Exec=/opt/Tools/eclipse/eclipse Icon=/opt/Tools/eclipse/icon.xpm Terminal=false Type=Application Categories=Development; ``` 4. 保存文件。 5. 给文件添加可执行权限(有时需要): ```bash chmod +x ~/Desktop/eclipse.desktop ``` 6. 如果创建在桌面,通常就会显示出来;如果创建在应用程序目录,可能需要刷新菜单(可以注销重新登录,或者运行命令如`update-desktop-database`)。 注意事项: - Exec的路径必须正确,且如果路径中有空格或特殊字符,需要用引号括起来。 - Icon的路径可以是绝对路径,也可以是图标主题中的名字(如firefox)。 - 如果程序需要root权限,可能需要使用gksu或pkexec等,但这样会涉及安全策略。 引用[3]中的例子: [Desktop Entry] Encoding=UTF-8 Name=eclipse Comment=Eclipse IDE Exec="/opt/Tools/eclipse/eclipse" Icon=/opt/Tools/eclipse/icon.xpm Terminal=false StartupNotify=true Type=Application Categories=Application;Development; 注意:Encoding在新版的桌面条目规范中已被弃用,可以省略。 另外,引用[1]中提到了通过拷贝已有的.desktop文件来创建,这是一种快速方法,但需要修改Exec和Icon等路径。 使用: 创建成功后,在桌面上双击图标或者在应用程序菜单中找到并点击即可启动程序。 如果创建后无法运行,可以检查: - 文件权限(是否可执行) - Exec指定的程序是否存在且可执行 - 路径是否正确(尤其注意相对路径和绝对路径) 同时,也可以尝试在终端中运行,看是否有错误输出: 例如:执行`/opt/Tools/eclipse/eclipse`,看是否能正常启动。 以上内容参考了提供的引用[1][2][3]。 </think> 在Linux系统中,`.desktop`快捷方式文件是实现应用程序快捷启动的关键配置文件。以下是详细的创建和使用方法: ### 一、创建方法 #### 方法1:手动创建配置文件(推荐) 1. **创建文件** 在桌面或应用目录执行命令(以Eclipse为例): ```bash nano ~/Desktop/eclipse.desktop # 桌面快捷方式 # 或系统级快捷方式(需sudo权限) sudo nano /usr/share/applications/eclipse.desktop ``` 2. **写入配置内容** ```ini [Desktop Entry] Name=Eclipse IDE # 显示名称 Comment=Java开发环境 # 描述 Exec=/opt/eclipse/eclipse # 程序绝对路径 Icon=/opt/eclipse/icon.xpm # 图标路径 Terminal=false # 是否在终端运行 Type=Application # 类型为应用程序 Categories=Development;IDE; # 分类标签 StartupNotify=true # 启用启动通知 ``` > 关键参数说明: > - `Exec`:必须使用**绝对路径**,含空格路径需用双引号包裹 > - `Icon`:支持PNG/SVG/XPM格式,尺寸建议≥128px > - `Categories`:定义菜单分类,标准值见[桌面规范](https://standards.freedesktop.org/menu-spec/latest/) #### 方法2:复制现有配置 ```bash cp /usr/share/applications/firefox.desktop ~/Desktop # 从系统目录复制 chmod +x ~/Desktop/firefox.desktop # 添加可执行权限 ``` ### 二、使用与调试 1. **权限设置** 创建后必须添加可执行权限: ```bash chmod +x ~/Desktop/*.desktop ``` 2. **生效验证** - 桌面快捷方式:创建后立即显示(需刷新桌面:`nautilus -q`) - 菜单快捷方式:刷新数据库 ```bash update-desktop-database ~/.local/share/applications ``` 3. **问题排查** 通过终端测试执行: ```bash /opt/eclipse/eclipse # 验证Exec路径是否正确 ``` 常见错误: - `权限不足` → `chmod +x 程序本体` - `图标不显示` → 检查图标路径格式(PNG/SVG优先) - `未出现在菜单` → 检查`.desktop`文件存放目录是否正确 ### 三、高级配置技巧 1. **多参数启动** ```ini Exec=env GDK_BACKEND=x11 /opt/app/app --debug-mode ``` 2. **多语言支持** ```ini Name[zh_CN]=Eclipse中文版 Comment[fr]=Environnement de développement ``` 3. **桌面环境兼容** - GNOME:需要`gio set file.desktop metadata::trusted true` - KDE:自动信任桌面文件 > 参考规范: > - 文件标准:[Desktop Entry Specification](https://standards.freedesktop.org/desktop-entry-spec/latest/) [^1] > - 图标主题:[Icon Theme Specification](https://standards.freedesktop.org/icon-theme-spec/latest/) [^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值