如果我既通过Snap安装了一个应用程序,又通过APT安装了同一个应用程序,我如何知道当前运行的是哪个版本?

如果我同时安装了相同的应用程序作为snap和使用APT,我将如何能够分别调用它们,并且如何知道哪个正在运行?
我还没有完全确信snap对最终用户来说是最好的选择,我想比较一下几个软件包的性能。

你可以使用Htop(快捷键F3)来搜索程序的名称,然后查看二进制文件的完整路径。如果路径类似于/snap/bin/....,那么它就是一个snap程序。或者如果你更喜欢使用"ps"命令,可以运行"ps -ef | grep program"。 - Parsa Mousavi
如果我输入buckle<tab><tab>来查看有哪些选项可用,我可以看到结果是"buckle bucklespring.buckle",然后如果我使用whereis buckle,它会回应*/usr/games/buckle告诉我这是一个已安装的deb软件包。如果我使用whereis bucklespring,我会得到/snap/bin/bucklespring.buckle*,告诉我这是一个snap软件。(为什么我两者都有,我不知道!!?)。在这种情况下,我可以通过路径选择,但由于名称不同,我不需要这样做。 - guiverc
Apt不是一个"版本",它是一个软件包管理器,与这个问题无关。事实上,你可以拥有一个没有apt的Ubuntu系统,虽然不太方便,但是确实是可能的。 - Braiam
不,Snap 不仅仅是一个软件包管理器,它也是一种文件格式(一种软件包),就像 deb 也是一种软件包一样。apt 是 dpkg 的前端和仓库管理器。你可以添加仓库,并由 apt 安装你的软件包,但以下回答不适用于这些软件包。换句话说:它是 Snap 仓库与 Ubuntu 仓库之间的对比。 - Braiam
由于OP和编辑之间的回滚战(顺便说一下:这些编辑是有益的,应该被保留),我已经回滚到了可接受的版本,并对此帖子进行了一些修改,并且锁定了此帖子一周,以让每个人冷静下来。在锁定期间,不再接受任何关于此帖子的活动。大家都去冷静一下吧。 - Thomas Ward
2个回答

分别调用它们

您可以通过提供可执行文件的完整路径名称启动应用程序的特定版本。例如,使用APT安装的Firefox将被启动为/usr/bin/firefox。snap应用程序的可执行文件位于/snap/bin/下,因此/snap/bin/firefox将启动snap版本。

输入firefox将启动APT版本,因为在默认的Ubuntu安装中/usr/bin在搜索路径中早于/snap/bin。默认的PATH为:

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

当你简单地输入firefox时,系统会在每个连续的目录中搜索,直到找到一个名为firefox的可执行文件。如果安装了APT版本,它将在搜索/snap/bin之前,在/usr/bin中找到该可执行文件,因此搜索将停止并启动该可执行文件。
你可以使用命令which了解将要启动的可执行文件。
$ which firefox
/usr/bin/firefox

你可以使用命令whereis来查看你安装了哪些可执行文件。
$ whereis firefox
firefox: /usr/bin/firefox /usr/lib/firefox /etc/firefox /snap/bin/firefox /usr/share/man/man1/firefox.1.gz

在这里,APT和snap版本的Firefox都已安装。
了解哪个正在运行
运行进程
命令ps ax列出所有正在运行的进程。因此:
ps ax | grep firefox

将列出所有名称为“firefox”的进程。输出包括可执行文件的完整路径名。

特定窗口的创建者

还可以识别特定窗口的创建者,以了解打开的窗口是来自APT还是snap版本。然而,这相当复杂且不总是可靠。请参阅Unix & Linux Stackexchange的问题What process created this X11 window?What process created this window with no PID associated?


使用APT安装的注意事项是,有些软件仓库提供的程序版本并不会将二进制文件安装在/usr/bin或/bin目录下。通过apt安装并不意味着它总是位于标准目录中。(二进制文件可能位于/opt或/usr/local目录下) - Braiam
通常情况下,我使用xkill命令来终止创建特定窗口或对话框的进程。然而,杀死进程并检查日志以确定是哪个进程的方法并不理想,但在开发环境中可以解决问题。 - Risav Karna
这是不正确的,通过sudo apt install chromium安装的Chromium实际上是一个snap包,which chromium-browser命令会输出/usr/bin/chromium-browser,但它仍然运行的是一个snap包。 - run_the_race

使用gnome-calculator的示例,许多人都有deb和snap格式的版本。
如何分别调用每个程序:让我们找到完整的路径。 $ which -a gnome-calculator # -a 在第一个匹配后继续搜索 /usr/bin/gnome-calculator /snap/bin/gnome-calculator $ whereis -b gnome-calculator # -b 仅返回二进制文件 gnome-calculator: /usr/bin/gnome-calculator /snap/bin/gnome-calculator 如何确定哪个正在运行。在这个例子中,两者都在运行。差异一目了然。 $ ps -x | grep gnome-calculator 69445 ? Sl 0:05 /snap/gnome-calculator/748/usr/bin/gnome-calculator 69549 pts/0 Sl 0:01 gnome-calculator 69727 pts/0 S+ 0:00 grep --color=auto gnome-calculator $ pgrep -af gnome-calculator 69445 /snap/gnome-calculator/748/usr/bin/gnome-calculator 69549 gnome-calculator

1你最好使用pgrep -a(或者pgrep -af来匹配完整的命令行),而不是通过管道连接psgrep - Byte Commander