我可以看到为什么安装了软件包吗?


111

对于特定的软件包,我可以找出为什么安装了它吗?

那么,我可以看到它还是它是手动安装的,还是作为另一个软件包的依赖项安装的?还是将其作为发行版的一部分安装?


这与这个问题有关(一部分),有关详细信息,请参见此答案
koushik 2010年

2017年更好的答案在这里:askubuntu.com/questions/128524/…–
Lambart

Answers:


107

一种快速的解决方案是在终端中输入以下命令:

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选项以列出直接或间接依赖于此的所有软件包。


默认情况下不包括可怜的能力:(
badp 2010年

1
@badp谢谢指出。这是特立独行的不良新做法,只是在livecd iso映像上节省了一些空间。但这是一个无价的工具,我一定会努力。
enzotib

15
apt-cache rdepends --recurse $package可能提供了太多的包裹。我将添加--installed选项以限制安装的软件包。-ioption限制于依赖前和依赖相关的程序包。但是可能安装了一个软件包,因为另一个软件包建议这样做。为了包括与建议相关的软件包,我认为这将给出正确的软件包:apt-cache rdepends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --installed --recurse $package
jarno 2013年

4
略短于@jarno的咒语,假设您使用bash或其他具有大括号扩展的外壳:apt-cache rdepends --no-{suggests,conflicts,breaks,replaces,enhances} --installed --recurse $package
akavel 2015年

30

通过在终端(Applications -> Accessories -> Terminal)中键入以下命令,可以找到关于为什么安装某些软件包的简短说明:

aptitude why <package-name>

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

i   shutter Suggests libgoo-canvas-perl

这基本上意味着shutter已建议libgoo-canvas-perl安装这种情况下的软件包。通过输入,aptitude why shutter我可以走依赖链。

但是,有一个警告。我经常注意到aptitude为这种情况找到了最合理的解释,虽然可能不是实际情况,但仍然可以为您提供进一步了解的线索。

就我而言,shutter建议libgoo-canvas-perl-但是,默认情况下不会自动安装建议的软件包。但是,由于无法编辑屏幕截图,shutter这使我对“体验”的记忆犹新,导致我手动安装ligbgoo-canvas-perl

最后,您可以通过运行以下命令来确定是否已自动安装软件包(由软件包管理系统根据您要求安装的其他软件包的依赖性和建议来确定是否强制安装)。

aptitude show <package-name>

这将输出如下一行(输出的第三行):

Automatically installed: no

有关更多信息,请运行info aptitude(在终端中)或访问Aptitude Wiki页面

要了解何时安装了特定的软件包,有两个选项:

  1. Synaptic软件包管理器维护所有活动的历史日志。若要查看历史记录日志文件,请从“文件”菜单中选择“历史记录”。您可以搜索Install(注意大小写)以列出有关安装的所有条目。但是,这只会显示使用Synaptic安装的软件包
  2. 在终端中运行以下命令。这将在dpkg日志中搜索安装历史记录条目。但是,保留这些日志的最大数量是最大限制,因此,如果要查找的软件包是很久以前安装的,则可能找不到。在这里更多细节

    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 PackageName | egrep“ \ install \ | \\ upgrade \”
克里斯·古德

12

是的,您可以,实际上,这是一个非常明显的命令。假设您已经安装了智能软件,则可以打开“终端窗口”广告类型:

aptitude why package

那应该给出依赖于该特定软件包的软件包列表。如果是手动安装的软件包,则会显示类似“找不到安装软件包的原因”之类的内容。


5

这是一种不依赖的简单方法,aptitude默认情况下不会再发布10.10。

图形化

打开Synaptic,然后尝试将其删除。

如果弹出对话框要求您删除其他软件包,则这些(递归地)依赖于这些软件包。

从终端

apt-get remove package_name_goes_here -s

同样,结果将要删除的软件包是所有(递归)依赖于此的软件包。(该-s参数告诉apt-get您实际上并未删除软件包。)


2
这是一个冒险的解决方案,因为如果它们单击不正确,它实际上可能会删除软件包和所有依赖项。
ImaginaryRobots 2010年

1
@ImaginaryRobots,这是很多误点击。(您必须在第一个对话框中单击“确定”,然后单击“应用”,然后在确认对话框中再次单击“确定”。)对于终端版本,y/N如果您键入错误,还需要额外的确认请求-s。我添加了一个警告。
badp 2010年

1
-1,因为在查看程序包的属性时,此信息在Synaptic的“依赖关系”选项卡下可用。
亚历山大

@alex错误-该对话框不会告诉您该软件包是手动安装还是自动安装。PS:收件箱计数器重置,请再努力一点。
badp 2010年

@badp否,但是该信息可以在主屏幕上的“已安装(手动)”状态过滤器中找到,并且在选择软件包时可以在软件包菜单中看到。
亚历山大
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.