Как точно проверить, установлен ли пакет в 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

Но, надеюсь, кто-то мог пролить свет.

контрольная сумма
источник

Ответы:

61

Вы пробовали это?

$ yum list installed bind
plasmid87
источник
Я получаю Error: No matching Packages to listи $?возвращает 1, а когда я пытался yum list installed bind-libs, $?возвращает 0. Что должно быть правильно до сих пор. Можно ли с уверенностью заключить, что ваша команда точно определит, установлен ли пакет? Я узнал rpm -q bindтолько сейчас. Это также эквивалентно вашей команде?
контрольная сумма
Это правильно, AFAIK, код выхода 0, только если пакет установлен.
Plasmid87
Я думаю, что это работает. И мне нравятся однолинейные решения
.:
Я думаю, что правильная команда с подстановочным знаком: yum list installed bind*
Алехандро Анджелико
2
@ NoahSussman Вы можете попытаться yum -C list installed bindизбежать сети. Это поддерживает все плагины включенными (на случай, если у вас есть что-нибудь экзотическое, что влияет на поиск в yumdb), а также сообщает вам о
репозитории,
13

Существует гораздо более простой способ выдачи этого запроса: rpm -qa | grep bindили rpm -q bind. Первое лучше, если вы не совсем уверены в названии пакета.

Джон
источник
4
+1, поскольку rpm -q $packageя считаю, что это самое быстрое и решение, поскольку выполнение любых действий yumможет привести к принудительному обновлению кэша (обычно медленному).
Алекс С
Это решение (использование rpm) должно быть принятым ответом, поскольку оно возвращает чистый статус выхода и не требует вызова нескольких удаленных URL-адресов, как это yumделают решения.
Ноа Суссман
1
@NoahSussman Коды выхода для yumи rpmследуют одному и тому же поведению во всех примерах, которые я могу себе представить (0 = установлено, 1 = не установлено / ошибка), поэтому было бы полезно узнать, видите ли вы другой код выхода. Пожалуйста, посмотрите на мой ответ выше относительно использования кэша, чтобы избежать доступа к сети
plasmid87
@ 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

domdambrogia
источник
Это приводит к подключению к удаленным репозиториям yum, когда все, что мне нужно, это посмотреть, что происходит на моей локальной машине.
Ноа Суссман
1
@NoahSussman, чтобы перечислить все пакеты, установленные на вашем локальном компьютере, которые вы можете использовать yum list installed. Оттуда вы можете использовать grepкоманду, чтобы получить более точный ответ на то, что вы ищете. Кроме того, если вы хотите , чтобы проверить наличие конкретного пакета вы можете добавить , что в вашей команде - Ex: php70w. yum list installed php70wбудет либо перечислять информацию об установленном пакете, либо возвращатьсяNo matching Packages to list
domdambrogia
-1

Используйте код Python, чтобы проверить, установлен ли пакет в Python с использованием yum:

def is_installed(package_name):
    return "not installed" in commands.getstatusoutput("rpm -q " + package_name)[1]
Эрик Лещинский
источник
не должно ли это быть not in?
Инбар Роуз
-2
yum list installed bind >/dev/null ; echo $?

Если результат равен 0 (ноль), пакет установлен

Том Эмерсон
источник
Это очень медленно по сравнению с rpm -q bindрешением, показанным в ответе Джона.
Ноа Суссман
Хотя, возможно, использование yum -C ...будет быстро.
Ноа Суссман