通过Snap安装的程序在启动器中没有显示出来。

刚刚升级到Ubuntu 16.04,第一次尝试使用snap软件包。
所以我需要meshlab来查看一些stl文件。遇到了p-i-t-n登录问题。发现命令行安装snap软件包不需要登录。执行了以下操作:
sudo snap install meshlab

嘿,meshlap安装好了,不需要登录。从命令行运行很正常。但是程序没有出现在启动器中。为什么会这样?snap包在启动器中不显示吗?我该如何解决这个问题?
17个回答

如果你正在使用zsh,snap二进制文件和桌面目录将不会自动添加到你的环境变量中。为了解决这个问题,我在/etc/zsh/zprofile中添加了以下行(取自Arch):
emulate sh -c 'source /etc/profile'

这将使用bash仿真处理您的/etc/profile文件,进而加载/etc/profile.d/*并设置正确的路径等。
若只想将snap目录添加到您的路径中,而不包括其余默认的bash配置,可按如下操作:
emulate sh -c 'source /etc/profile.d/apps-bin-path.sh'

2谢谢!在17.10上也运行得很好。对我来说,切换到zsh也带来了这个问题。 - AgnosticMantis
3他们应该在安装过程中修复这个问题,或者为Snap添加常见问题解答/故障排除步骤。 - BradErzwh
1谢谢,对我来说在18.10版本上有效。希望这个问题将来能够得到修复。 - Pavel Davydov
2很棒,不幸的是,在19.04上仍然存在问题。 - jhole89
4可能对一些人来说很明显,但在更改后请登录/注销。 - Dominic Pixie
这对我有用——使用zsh。 - GTF
5年了,我仍然回来寻找解决方案。这个问题确实应该在快照常见问题解答中得到解决。 - Alvin Smith

/var/lib/snapd/desktop/applications/复制应用程序快捷方式到/usr/share/applications/ 示例: sudo cp /var/lib/snapd/desktop/applications/brave_brave.desktop /usr/share/applications/ 我在GalliumOS 3.0(基于Xubuntu)上不得不这样做。

2简单明了 - evening_g
将所有的.desktop文件复制到/usr/share/applications/目录下,使用sudo cp命令。 - Francisco Kahil

对我来说,这似乎也与在Ubuntu 18.04下使用Wayland/ZSH的组合有关 - 尽管/var/lib/snapd/desktopXDG_DATA_DIRS变量中被列出(这是由/etc/profile.d/apps-bin-path.sh完成的),但启动器无法识别该文件夹中的应用程序。
一个快速的解决方法是创建所需桌面文件的符号链接,例如:
ln -s /var/lib/snapd/desktop/applications/rubymine_rubymine.desktop .local/share/applications

我在Kali Linux上遇到了与Discord相同的问题。我按照你的建议做了,但是将.desktop文件复制到了我的用户~/Desktop目录下,并通过点击新创建的桌面图标来执行它。cp /var/lib/snapd/desktop/applications/discord_discord.desktop ~/Desktop - Toguko

它已经内置在快照系统中,但你必须将链接添加到你的仪表盘上。要启动程序,请输入

snap run meshlab

一旦它启动起来,右键点击图标,然后点击“添加到Dash”。

低估的解决方案。 - user7778287

在运行Kubuntu 18.04的情况下,对我来说解决方案是添加以下内容
export XDG_DATA_DIRS="$XDG_DATA_DIRS:/var/lib/snapd/desktop/"

将内容翻译成中文:将文件保存为snap-apps.sh,放在~/.config/plasma-workspace/env目录下。但这仅适用于Plasma 5,并且可能已在Ubuntu 18.10中修复。
正如dsager的回答中已经提到的,通常的/etc/profile.d/apps-bin-path.sh似乎不起作用。

4这个完美地运行了 - 一个Kubuntu用户。 - john
在将Ubuntu 22.10转换为Kubuntu 22.10后,出现了这个问题,但经过修复解决了。 - Zach Bloomquist

Snap包在启动器中不显示吗?
只要Snap包正确地提供了.desktop文件,它们就会显示在启动器中。只有Meshlab的meshlabserver有一个正确的.desktop文件(确实显示在我的启动器中)。然而,meshlab的.desktop文件尝试执行meshlab.meshlab,而应该使用meshlab。因此,它没有显示出来。
我该如何解决这个问题?
如果你运行snap info meshlab,你会看到发布者的联系信息。我建议你向他们报告一个错误。在那之前,你可以从命令行运行meshlab,或者为它创建自己的.desktop文件。

我无法对别人的帖子进行评论。不过,这是为了补充dsager的答案,这个答案在Fedora 28上对我很有帮助(据我所知,Fedora 28使用Wayland)。
我在我的~/.bash_profile中添加了以下代码片段,以便在每次登录时链接/var/lib/snapd/desktop/applications目录中的每个文件。类似地,可以通过在for行和if行中切换路径,并将ln替换为rm来修改此代码以删除不再存在的应用程序的链接。
for i in /var/lib/snapd/desktop/applications/*.desktop; do
    if [ ! -f ~/.local/share/applications/${i##*/} ];then
            ln -s /var/lib/snapd/desktop/applications/${i##*/} ~/.local/share/applications/${i##*/};
    fi;
done

这个可能有几种不同的方法来完成,但它是有效的。

1无用的使用 ls。使用 for in /var/lib/snapd/desktop/applications/*.desktop; do i="${i##*/}"; ... 代替。更简洁的方法是 ln -st ~/.local/share/applications /var/lib/snapd/desktop/applications/*.desktop 2>/dev/null - David Foerster
我知道有一种方法可以执行你的第一个示例,但是当我最初写这个时,我记不起来${i##*/}部分了。我会编辑我的帖子,包括那个变体。然而,你后面的建议没有检查链接是否已经存在,因此无用地重新执行了ln命令。事实上,我想找到一种方法来避免使用grep,以减少执行时产生的进程数量。谢谢你的评论。 - Eric Niconovich
我的第二个建议确实会检查目标文件是否已经存在,如果是这种情况,它会打印一个错误消息(重定向到/dev/null并因此被抑制)。它不会做任何“无用”的事情:它只会分叉和执行一次,并为每个匹配的文件调用一次symlink(2)symlinkat(2)系统调用。如果您使用循环来检查文件类型(stat(2)),然后(有条件地)分叉和执行ln(1),该命令会调用symlink*(2),那么这将是更多的“无用”工作。 - David Foerster

对于我来说,帮助命令是:

ln -s /var/lib/snapd/desktop/applications ~/.local/share/applications/snap

这个命令将snap应用程序的快捷方式链接到我的本地文件夹。现在我可以像其他应用程序一样运行snap应用程序了。


你需要在终端中运行命令 snap run meshlab 并停止它,然后你就会在应用列表中看到 Meshlab

Snap二进制文件存储在Debian 10(buster)中的/snap/bin目录中。将该目录添加到$PATH并重新加载bash配置文件~/.bashrc。
echo -n "export PATH=/snap/bin:\$PATH" >> ~/.bashrc
source ~/.bashrc

关于Debian中快照不在启动器中的错误:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=931776 - simohe
这真的帮了很多,伙计,谢谢你。 - Ashfaq nisar
我刚刚在Debian上通过snap安装了Discord。 这终于让应用程序出现在启动器中。 非常感谢! - PatrickSteiner