在.desktop文件中设置变量

有没有办法在.desktop文件中设置环境变量? 我正在尝试使用自定义的gtk样式运行应用程序(eclipse),所以基本上我想通过运行一个.desktop文件来获得以下结果:
GTK2_RC_FILES=gtkrc.custom /path/to/eclipse

我尝试将它放入一个bash脚本并从.desktop文件中运行,但是这样做后它与Unity启动器的整合效果不好。
3个回答

你可以通过编辑应用程序的.desktop文件来添加环境变量。例如,要使用环境变量APPMENU_DISPLAY_BOTH=1运行"digiKam",找到相应的digikam.desktop文件,并通过env命令将变量设置添加到"Exec"条目中。
Exec=env APPMENU_DISPLAY_BOTH=1 digikam -caption "%c" %i

在你的情况下:
Exec=env GTK2_RC_FILES=gtkrc.custom /path/to/eclipse

2如何设置包含用户$HOME的环境变量?无论是Exec=env MYVAR="$HOME/foo"还是Exec=env MYVAR="~/foo"都不会被扩展。相反,它们会被直接传递。 - 400 the Cat
1根据https://stackoverflow.com/a/8980518/1446479中所描述的,看起来你可以做到。 - peedee
对于其他寻找稍有变化的人,您还可以使用-u标志取消设置环境变量,例如env -u DONT_WANT_THIS_SET some-command - Tom Saleeba

一个修改 .desktop 文件的替代方案是将包装脚本放置在例如 ~/bin 中。
$ cat ~/bin/eclipse
#!/bin/sh
export GTK2_RC_FILES=gtkrc.custom
exec /usr/bin/eclipse "$@"

这样一来,下次更新应用程序包时就不会覆盖掉自定义设置。
编辑:
通过检查“路径”变量包含的内容,你可以看到为什么这样可以实现。在我的情况下:
$ echo $PATH
/home/gunnar/bin:/home/gunnar/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

~/bin是列表中的第一个文件夹,因此在/usr/bin之前被查看。


如果你只是把你的.desktop文件放在本地设置中,它不会被覆盖掉的,无论如何。 - Auspex
@Auspex:没错。但同时,如果你使用本地副本,就无法从可能的更新中受益,这些更新是由 .desktop 文件所拥有的包提供的。 - Gunnar Hjalmarsson
1我不明白将一个包装器放在~/bin目录下如何解决这个问题。由软件包拥有的.desktop文件永远不会看到那个包装器!你还需要使用update-alternatives命令。 - Auspex
@Auspex:.desktop文件不需要“看到”包装器。它只是执行eclipse,由于PATH的原因,选择了包装器而不是/usr/bin/eclipse。我编辑了答案以澄清。 - Gunnar Hjalmarsson
是的,.desktop 文件确实需要看到包装器。我原本以为平均的 .desktop 文件指定了完整路径,但进一步检查后我发现大多数系统的文件只指定了命令名称,因此会看到你的包装器。然而,我手头上唯一拥有的 Eclipse 桌面文件都是问题中指定的格式,给出了 Eclipse 二进制文件的完整路径。 - Auspex
1@Auspex:嗯,Ubuntu存档中提供的版本(直到18.10)是Exec=eclipse。但是我同意,如果.desktop文件指定了完整路径,那么我的回答就不适用了。 - Gunnar Hjalmarsson

这似乎是kmenuedit的问题。它从不保存.desktop文件中的"环境变量"字段。希望这能帮到你。我已经向KDE报告了一个错误。"FOO=my_var_1"从不被保存,也不会发送给应用程序。