我可以查看为什么安装了一个软件包吗?

对于一个特定的软件包,我能否查看它为何被安装?
所以,我能否看到它是手动安装的,还是作为其他软件包的依赖项安装的?或者它是作为发行版的一部分安装的?

这与这个问题有关,详细信息请参考答案 - koushik
12017年的更好答案在这里:https://askubuntu.com/questions/128524/how-to-list-dependent-packages-reverse-dependencies - Lambart
可能是如何列出依赖包(反向依赖)的问题的重复。 - apaderno
4个回答

一个快速的解决办法是在终端中输入以下命令:
aptitude why $package

或者,如果你只对最终的原因感兴趣:
aptitude why $package --show-summary

$package替换为软件包的名称,并且您可能需要先安装aptitude软件包。

以下是您可能在aptitude why aspell --show-summary命令的输出。

Packages requiring aspell:
  inkscape

要获取更详细的信息,您可以运行aptitude why aspell。您可以按照下面的示例输出进行阅读:“您手动安装了inkscape,它需要libgtkspell,它需要libenchantic2a,它需要aspell”。(i标记表示已安装的软件包;A标记表示自动安装的软件包。)
i   inkscape       Depends libgtkspell0 (>= 2.0.10)                                                                    
i A libgtkspell0   Depends libenchant1c2a (>= 1.6.0)                                                                   
i A libenchant1c2a Depends aspell-en | myspell-dictionary | aspell-dictionary | ispell-dictionary | hunspell-dictionary
i A aspell-en      Depends aspell (>= 0.60.3-2)

最后,执行以下命令
apt-cache rdepends --installed $package

列出安装在您的计算机上直接依赖于$package的其他软件包。您可以添加--recurse选项以列出所有直接或间接依赖于它的软件包。

3可惜天赋不是默认包含的 :( - badp
2@badp 感谢您指出。这是与Maverick有关的坏消息,只是为了在LiveCD ISO映像上节省一些空间。但它是一个非常宝贵的工具,我不会放弃使用它。 - enzotib
26apt-cache rdepends --recurse $package 可能会返回太多的软件包。我建议添加 --installed 选项来限制只返回已安装的软件包。-i 选项将限制返回与先决条件和依赖关系相关的软件包。但是,某个软件包可能被另一个软件包推荐而被安装。为了包括这些推荐相关的软件包,我认为以下命令可以得到正确的结果:apt-cache rdepends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --installed --recurse $package - jarno
9如果你使用的是bash或其他支持花括号扩展的shell,那么这是@jarno的咒语的稍微简短的等效方式:apt-cache rdepends --no-{suggests,conflicts,breaks,replaces,enhances} --installed --recurse $package - akavel

在终端中输入以下命令(应用程序 -> 辅助工具 -> 终端),可以快速简短地解释为什么安装了特定的软件包。
aptitude why <package-name>

用您感兴趣的软件包名称替换aptitude why libgoo-canvas-perl。例如,键入aptitude why libgoo-canvas-perl会输出以下内容:
i   shutter Suggests libgoo-canvas-perl

这基本上意味着在这种情况下,包shutter建议安装libgoo-canvas-perl。然后通过键入aptitude why shutter,我可以追溯依赖关系链。
然而,有一点需要注意。我经常注意到aptitude找到的最可信的解释可能不是实际情况,但它仍然会给你一个线索让你进一步调查。
在我的情况下,shutter建议安装libgoo-canvas-perl - 然而,默认情况下并不会自动安装建议的软件包。尽管如此,这提醒了我无法使用shutter编辑截图的“体验”,于是我手动安装了libgoo-canvas-perl 最后,您可以通过运行以下命令来查看软件包是否被自动安装(也就是由软件包管理系统根据您要求安装的其他软件包的依赖关系和推荐项来决定)
aptitude show <package-name>

这将输出一行类似于下面的内容(输出的第三行):
Automatically installed: no

欲知详情,请运行info aptitude(在终端中)或访问Aptitude wiki page页面。

要找出特定软件包的安装时间,有两个选项:

Synaptic软件包管理器会维护所有活动的历史记录。要查看历史记录文件,请从文件菜单中选择“历史记录”。您可以搜索Install(注意大小写)以列出所有与安装相关的条目。然而,这只会显示使用Synaptic安装的软件包。
在终端中运行以下命令。这将搜索dpkg日志以查找安装历史记录条目。但是,这些日志的保留量有最大限制,所以如果您要查找的软件包是很久之前安装的,可能找不到。更多详细信息请参考here
zcat -f /var/log/dpkg.log* | grep "\ install\ " | grep -i <package-name>

1如果你想查找一个软件包何时被安装或升级,可以使用以下命令:zcat -f /var/log/dpkg.log* | grep -i PackageName | egrep "\ install\ |\ upgrade\ " - Chris Good
@ChrisGood:你能重新输入你的评论,不要使用智能引号,这样就可以复制/粘贴了吗? - Dan Dascalescu
1感谢您指出。使用正确的双引号:zcat -f /var/log/dpkg.log* | grep -i 包名 | egrep "\ install\ |\ upgrade\ " - Chris Good

这里有一个简单的方法,不依赖于默认情况下不再提供的aptitude。
图形化方式: 打开Synaptic并尝试删除它。 如果弹出对话框要求您删除其他软件包,那些软件包是依赖于它的(递归)软件包。
从终端命令行方式:
apt-get remove package_name_goes_here -s

再次强调,作为结果会删除所有(递归地)依赖于它的软件包。(-s参数告诉apt-get不要真正删除该软件包。)

3这是一个冒险的解决方案,因为如果他们误点击,它实际上可能会移除整个软件包及其所有依赖项。 - ImaginaryRobots
1@ImaginaryRobots,这是很多次误点击了。(你必须在第一个对话框上误点击“确定”,然后点击“应用”,再次在确认对话框上误点击“确定”。)对于终端版本,如果你在输入-s时打错字,还会有额外的y/N确认请求。不过我已经添加了一个警告。 - badp
1-1 因为这些信息可以在 Synaptic 的依赖选项卡中找到,在查看软件包属性时。 - alexanderpas
@alex 错误 - 那个对话框并不能告诉你该软件包是手动安装还是自动安装的。PS:收件箱计数器重置,请再努力一点。 - badp
@badp 不,但是可以在主屏幕上使用“已安装(手动)”状态过滤器找到该信息,并在选择软件包时在软件包菜单中看到。 - alexanderpas
@alex "installed (manual)" 给你一个列出所有你不关心依赖项的软件包列表。你需要一个"installed (auto)" 过滤器,但默认情况下没有这个选项。 - badp
@badp 需要root访问权限吗?至少对于使用apt-get-s标志运行,您不需要root权限。我经常以有限用户身份运行apt-get -s remove ...看起来是这样的。 另一方面,apt-get(8)确实说我“可能没有读取所有apt配置扭曲模拟”。我长期以来假设在正确配置且权限设置合理的系统上,这不太可能成为问题,前提是没有同时进行其他软件包管理操作(正如输出所警告的)。你知道吗? - Eliah Kagan
+1 对于apt-get remove -s解决方案表示赞同。如果你需要用它来清理嵌入式设备,你肯定不想先安装18 MB的aptitude和相关依赖! - Philippos

是的,你可以这样做,而且实际上这是一个相当明显的命令。假设你已经安装了aptitude,你可以打开一个终端窗口并输入:
aptitude why package

这将提供一个依赖于特定软件包的软件包列表。如果它是一个手动安装的软件包,它会显示类似于“找不到安装软件包的原因”的信息。