这.desktop 文件已成为轻松访问 Linux 桌面上的应用程序的事实上的标准,否则无法从 GUI 轻松启动可执行文件,并且许多启动器不使用应用程序图标,而仅使用 .desktop 文件中指定的图标。
那么,为什么似乎不可能使用指定其可执行文件的相对路径的 .desktop 文件,有没有办法解决这个问题?
当发布不想强迫用户安装的软件时,相对路径是实现这一点的唯一方法。
AppImage 似乎通过在用户第一次运行时安装 .desktop 文件来解决这个问题,这似乎是一种为具有灵活路径的软件启用图标和启动器的笨拙方法。相对路径将是一个更好的方法。为什么这个解决方案在 Linux 桌面上不可行?这似乎不太可能只是一个疏忽,而是我忽略了这个决定背后的更深层次原因。
答案1
您可以使用内联 shell 脚本来计算路径:
Exec=sh -e -c "exec \\"\\$(dirname \\"\\$0\\")/some_app\\"" %k
是的,需要两级转义。
答案2
请记住,FreeDesktop 标准只是一个标准。原则上,KDE、GNOME、LXDE 或 XFCE 等供应商可以在不经过标准流程的情况下添加对相对路径的支持,但实际上他们都没有这样做。 (我确信 GNOME 3.28.2 和 KDE Plasma 5.12.9 都不支持相对路径,而且据我所知,其他桌面环境也不支持相对路径。)
为什么是这样?
原因1:最简单版本的相对路径会与现有标准冲突。
考虑这个桌面文件:
[Desktop Entry]
Type=Application
Name=My example app
Exec=my_example_app
Icon=example-app
标准按键
Icon
在文件管理器、菜单等中显示的图标。如果名称是绝对路径,则将使用给定的文件。如果名称不是绝对路径,则使用中描述的算法图标主题规范将用于定位图标。
[。 。 。 ]
类型值
iconstring
是图标的名称;这些可能是绝对路径,或者是使用中描述的算法定位的图标的符号名称。图标主题规范。此类值用户不可显示,并且以 UTF-8 编码。
由于example-app
不是绝对路径,想要显示图标的菜单和面板将遵循图标主题规范来找到正确的路径,通常通过查找类似的文件夹
/usr/share/icons/hicolor/48x48/apps/example-app.png
但是,example-app
也是有效的相对路径,因此图标字符串现在不明确。如果一个桌面环境采用相对路径,而其他桌面环境不采用相对路径,则会破坏兼容性。
同样,考虑Exec
关键:
Exec=my_example_app
根据规范,它必须是完整路径(即绝对路径)或可执行文件$PATH
:
该
Exec
密钥必须包含命令行。命令行由一个可执行程序(可选地后跟一个或多个参数)组成。可执行程序可以使用其完整路径或仅使用可执行文件的名称来指定。如果未提供完整路径,则会在$PATH
桌面环境使用的环境变量中查找可执行文件。
所以my_example_app
应该在 中查找$PATH
,但如果我们认为这是一个相对路径,我们将不得不查找可能$PATH
根本不存在的地方。哪一个优先?
现在,也许我们可以要求所有相对路径都带有前缀
来./
消除它们的歧义。由于/
文件名中不允许使用,因此这不会含糊不清,例如:
Icon=./example-app.png
Exec=./my_example_app
对于同一工作目录中的文件或
Icon=./../example-app.png
Exec=./../my_example_app
对于父目录中的文件。
这就提出了另一个问题:什么算作工作目录?
原因 2:桌面文件的预期工作目录可能不清楚。
桌面文件可以使用以下键设置工作目录Path
:
Path
如果条目的类型为
Application
,则运行程序的工作目录。
因此,如果桌面文件具有有效Path
密钥并且要指定如下相对路径:
Path=/home/username/path/to/myfolder/
Exec=./my_example_app
这是相对于桌面文件的位置还是相对于密钥Path
?
还有其他可能性需要考虑。
路径应该相对于
$XDG_DATA_HOME
吗?这是有一定道理的,因为它是实际桌面文件和图标的存储位置,但不是可执行文件的存储位置。
路径应该相对于启动程序进程的工作目录吗?
这是有道理的,因为显示面板或菜单的进程需要知道可执行文件和图标在哪里。通常窗口管理器的工作目录是用户的主目录,但原则上工作目录可以是任何地方。
原因3:如果移动桌面文件,则必须更新相对路径。
好的,假设我们指定可执行文件和图标的路径始终相对于桌面文件,忽略密钥Path
、启动器进程和其他所有内容。
现在假设我们想将该桌面文件复制到其他地方,例如:
~/Desktop/example-app.desktop
现在相对路径不同了,我们必须编辑桌面文件并重新更改路径。使用绝对路径或标准文件夹位置可以解决此问题。
原因 4:菜单和面板可能要求桌面文件位于任意位置。
只要我们将桌面文件保存在同一目录中并且仅使用文件管理器运行它,相对路径就可以工作。但是假设我们想从菜单或面板启动器运行桌面文件。现在桌面文件可能位于
/usr/share/applications/
或者它可能在
~/.local/share/applications/
或在
~/.config/xfce4/panel/
请注意,图标或可执行文件的相对路径对于其中任何一个都不相同。此外,取决于$XDG_DATA_HOME
和$XDG_DATA_DIRS
,桌面文件可能完全在其他地方。
在最初的问题中,所述用例是从 GUI 运行可执行文件并显示自定义图标而无需安装。
否则,可执行文件不容易从 GUI 启动,并且许多启动器不使用应用程序图标,而仅使用 .desktop 文件中指定的图标。
那么,为什么似乎不可能使用指定其可执行文件的相对路径的 .desktop 文件,有没有办法解决这个问题?
当发布不想强迫用户安装的软件时,相对路径是实现这一点的唯一方法。
我们首先费心软件的标准安装过程的一个原因是将资源放置在标准位置,以便其他进程可以找到它们。这使得安装和卸载变得更加复杂,但有助于缓存和调试等操作,因为需要检查的目录较少。
如果我们不想安装可执行文件,我们仍然可以通过相对路径运行它,但是如果我们想要方便地通过另一个进程(例如菜单启动器或面板)启动它,另一个进程必须知道在哪里看一下,由于每个进程都有自己的工作目录,因此它们的相对路径可能不同。
这规格有话要说:
因此,您是应用程序作者,并且想要安装应用程序图标,以便它们可以在 KDE 和 Gnome 菜单中工作。至少你应该在 hicolor 主题中安装一个 48x48 的图标。这意味着在 $prefix/share/icons/hicolor/48x48/apps 中安装 PNG 文件。您可以选择安装不同尺寸的图标。例如,在 $prefix/share/icons/hicolor/scalable/apps 中安装 svg 图标意味着大多数桌面将拥有一个适用于所有尺寸的图标。
所以我们可以在这里安装一个图标:
~/.local/share/icons/hicolor/48x48/apps/example-app.png
或在这里:
~/.local/share/icons/hicolor/scalable/apps/example-app.svg
iconstring
然后简单地像这样引用example-app
:
Icon=example-app
并且启动程序进程将能够找到该图标。
这并不是真正的相对路径,但它解决了必须使用绝对路径的问题,并且如果桌面文件移动到其他位置也不会中断。
这同样适用于Exec
密钥,只不过它是可执行文件$PATH
而不是图标文件夹中的图像。
结语:先前的讨论和链接。
应该注意的是,至少早在 2008 年 9 月,FreeDesktop 邮件列表就已经讨论了对图标相对路径的支持:
马格努斯·伯格马克 magnus.bergmark at gmail.com
2008 年太平洋夏令时间 9 月 23 日星期二 01:01:32
[。 。 。 ]
我建议我们也允许以某种方式使用相对路径。
用例
我使用大量 .directory 文件来制作包含电影的目录,并将电影海报作为图标。这种行为可以适用于任何形式的媒体,例如漫画书、音乐(专辑艺术)和照片。
供应商可能希望将图标捆绑到他们正在分发的软件中,以与 .desktop 文件一起使用,该文件不会出现在桌面菜单中,因此仍位于应用程序目录中。
https://lists.freedesktop.org/archives/xdg/2008-September/009940.html
我能找到的对此提案的唯一反驳是:
不打算进入标准应用程序目录的 .desktop 文件几乎完全无用。也许您应该查看一些软件包建议和实现,并使用它们。另一个选项是 xdg utils 脚本,用于将 .desktop 文件和图标安装在适当的位置。我只能假设您卸载的应用程序也打算不遵循图标主题和图标命名规范。而且我不认为设置目录的图标真的有用。尽管 elf 二进制文件没有像 win32 二进制文件那样的资源,但为实际的可执行文件设置图标会更有用。
https://lists.freedesktop.org/archives/xdg/2008-September/009962.html
相关问题:
- https://askubuntu.com/questions/277190/how-to-package-an-application-icon-properly
- https://stackoverflow.com/questions/3452746/how-can-i-specify-an-icon-with-a-relative-path-for-a-linux-desktop-entry-file
- 是否有覆盖图标的主目录位置?
- 将图标分配给自定义 mimetype
相关链接:
- https://gitlab.freedesktop.org/xdg/xdg-utils/-/issues/82
- https://bugs.kde.org/show_bug.cgi?id=68507
- https://bugs.kde.org/show_bug.cgi?id=73463
- https://lists.freedesktop.org/archives/xdg/2008-September/009940.html
- https://lists.freedesktop.org/archives/xdg/2011-April/011883.html
- https://specations.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
答案3
我需要一个相对于我的 .home 目录的路径firefox.desktop
。这样每个用户都会启动自己的 Firefox 配置文件,即firefox-frank
坐在~/Documents/...
aka中/home/frank/Documents/...
这是有效的执行行:(感谢上面@timothy-baldwin 的回答)
Exec=sh -e -c "/usr/bin/firefox -profile \"/home/$(whoami)/Documents/chrome-profiles/firefox-$(whoami)\""
答案4
为了理解这种情况,问问自己,“相对于什么?”。这些.desktop
文件用于 GUI 上下文中,不能假定基本路径可以根据您可能考虑放入.desktop
文件中的任何相对路径构建绝对路径。
相对路径仅在可以转换为明确位置(绝对路径)时才有用,并且需要参考点。这不能在任何通用 GUI 上下文中假设。