如何准确检查yum中是否安装了软件包?


56

我不断得到像这样的答案:

yum list installed | grep bind

要么

rpm -qa | grep bind

但这是不准确的,因为我得到了一些其他像这样的绑定包的列表:

bind-utils-9.8.2-0.17.rc1.el6_4.5.x86_64
rpcbind-0.2.0-11.el6.x86_64
bind-libs-9.8.2-0.17.rc1.el6_4.5.x86_64
samba-winbind-3.6.9-151.el6.x86_64
samba-winbind-clients-3.6.9-151.el6.x86_64
ypbind-1.20.4-30.el6.x86_64

那不是我想要的。相反,我想准确检查绑定核心软件包是否已安装。例如。bind.x86_64 32:9.8.2-0.17.rc1.el6_4.6

我希望有这样的东西:

yum check installed bind

但希望有人能照亮。

Answers:


61

你有尝试过吗?

$ yum list installed bind

我得到Error: No matching Packages to list$?返回1,当我尝试时yum list installed bind-libs$?返回0。到目前为止应该是正确的。我可以安全地得出结论,您的命令可以准确确定是否已安装软件包吗?我刚才确实发现了rpm -q bind。它也等同于您的命令吗?
校验和

这是正确的AFAIK,只有安装了软件包,才退出代码0。
质粒87 2013年

我认为这是有效的。我喜欢单行解决方案
checksum

我认为正确的命令是使用通配符: yum list installed bind*
Alejandro Angelico

2
@NoahSussman您可以尝试yum -C list installed bind避免网络。这样可以使所有插件保持启用状态(以防万一您有任何影响yumdb中查找的奇特功能),并且还告诉您该软件包的安装回购日期为
Plasmid87

13

发出此查询的方法要简单得多:rpm -qa | grep bindrpm -q bind。如果您不确定软件包名称,最好使用前者。


4
rpm -q $package我相信+1 是最快的解决方案,因为执行任何操作都yum可能会强制进行高速缓存更新(通常很慢)。
Alex S

该解决方案(使用rpm)应该是可以接受的答案,因为它返回干净的退出状态,并且不需要像yum解决方案那样调用大量的远程URL 。
诺亚·萨斯曼

1
@NoahSussman 在我能想到的所有示例中,退出代码yumrpm遵循相同的行为(0 =已安装,1 =未安装/错误),因此了解您是否看到不同的退出代码将很有用。请看一下我上面关于使用缓存来避免网络访问的响应
Plasmid87 '18

@ plasmid87我不知道我可以yum -C用来防止yum花费所有额外的时间与网络主机联系。谢谢,我现在看到在这里如何可以互换使用yum和rpm!
诺亚·萨斯曼

9

解析此命令的结果是最完整的答案。您需要知道确切的软件包名称。

yum info bind

Loaded plugins: refresh-packagekit, rhnplugin
This system is receiving updates from RHN Classic or RHN Satellite.
Installed Packages
Name        : bind
Arch        : x86_64
Epoch       : 32
Version     : 9.8.2
Release     : 0.17.rc1.el6_4.6
Size        : 7.3 M
Repo        : installed
From repo   : rhel-x86_64-workstation-6
Summary     : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server
URL         : http://www.isc.org/products/BIND/
License     : ISC
Description : BIND (Berkeley Internet Name Domain) is an implementation of the DNS
        : (Domain Name System) protocols. BIND includes a DNS server (named),
        : which resolves host names to IP addresses; a resolver library
        : (routines for applications to use when interfacing with DNS); and
        : tools for verifying that the DNS server is operating properly.

2
嗯,这不是在告诉我bind可用/有效的yum软件包,而是告诉我是否已安装吗?
校验和

2
这不是很明显,但是如果Repo标签下列出了已安装,则表示已安装。否则,它将列出可用的存储库。
弗雷德神奇魔术犬

当我只想查看本地计算机上正在发生的事情时,这导致连接到远程yum仓库。
诺亚·萨斯曼

1

我想出的最好的衬纸是这样做的(这对于在脚本中快速使用非常有用):

yum info <package_name> | grep Repo | awk '{ print $3 }'

例如:如果我当前已git安装:

yum info git | grep Repo | awk '{ print $3 }'

这将返回 installed

如果我现在已经git安装了相同的前一个命令将返回:base/7/x86_64这是当前可用的安装git


当我只想查看本地计算机上正在发生的事情时,这导致连接到远程yum仓库。
诺亚·萨斯曼

1
@NoahSussman列出您可以使用的本地计算机上当前安装的所有软件包yum list installed。在这里,您可以使用该grep命令为您要查找的内容获得更精确的答案。另外,如果要检查特定的软件包,可以将其添加到命令-Ex:中php70wyum list installed php70w会在已安装的软件包中列出信息或返回No matching Packages to list
domdambrogia

-1

使用Python代码检查是否使用yum在python中安装了软件包:

def is_installed(package_name):
    return "not installed" in commands.getstatusoutput("rpm -q " + package_name)[1]

这不是not in吗?
Inbar Rose '18

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.