Como verificar com precisão se o pacote está instalado no yum?

56

Eu continuo recebendo respostas como:

yum list installed | grep bind

ou

rpm -qa | grep bind

Mas isso não é exato, pois estou recebendo uma lista de alguns outros pacotes de ligação como estes:

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

Não é isso que eu queria. Em vez disso, gostaria de verificar com precisão se o pacote principal de ligação foi instalado. Por exemplo.bind.x86_64 32:9.8.2-0.17.rc1.el6_4.6

Eu esperava algo como:

yum check installed bind

Mas espero que alguém possa lançar a luz.

soma de verificação
fonte

Respostas:

61

Você já tentou isso?

$ yum list installed bind
plasmid87
fonte
Estou recebendo Error: No matching Packages to liste $?retornando 1 e, quando tentei yum list installed bind-libs, $?retorna 0. O que deve estar correto até agora. Posso concluir com segurança que seu comando é determinar com precisão que um pacote está instalado? Eu descobri rpm -q bindagora. É equivalente ao seu comando também?
checksum
Correto, AFAIK, saia do código 0 apenas se o pacote estiver instalado.
precisa saber é o seguinte
Eu acho que isso está funcionando. E eu gosto de soluções de linha única
.: D
Eu acho que o comando correto é com um curinga: yum list installed bind*
Alejandro Angelico
2
@NoahSussman Você pode tentar yum -C list installed bindevitar a rede. Isso mantém todos os plugins ativado (apenas no caso de você ter qualquer coisa exótica que afeta pesquisas em yumdb) e também lhe diz o repo o pacote foi instalado a partir de
plasmid87
13

Existe uma maneira muito mais fácil de emitir esta consulta: rpm -qa | grep bindou rpm -q bind. O primeiro é melhor se você não tiver certeza absoluta do nome do pacote.

John
fonte
4
+1, pois rpm -q $packageacredito que essa é a solução e a mais rápida, pois fazer qualquer coisa yumpode forçar uma atualização de cache (geralmente lenta).
Alex S
Essa solução (usando rpm) deve ser a resposta aceita, pois retorna um status de saída limpo e não requer a chamada de vários URLs remotos como as yumsoluções.
Noah Sussman
11
@NoahSussman Os códigos de saída yume rpmseguem o mesmo comportamento em todos os exemplos em que consigo pensar (0 = instalado, 1 = não instalado / erro), portanto, seria útil saber se você está vendo um código de saída diferente. Por favor, dê uma olhada na minha resposta acima sobre usando o cache para evitar o acesso à rede
plasmid87
@ plasmid87 Eu não sabia que poderia usar yum -Cpara impedir que o yum passasse todo esse tempo extra entrando em contato com os hosts da rede. Obrigado, agora vejo como yum e rpm podem ser usados ​​de forma intercambiável aqui !!
Noah Sussman
9

A análise dos resultados deste comando é a resposta mais completa. Você precisará saber o nome exato do pacote.

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.
Fred, o Cão Maravilha Mágico
fonte
2
Hmm, isso não está me dizendo que bindestá disponível / pacote yum válido, em vez de me dizer se está instalado?
soma de verificação
2
Não é óbvio, mas se instalado estiver listado na tag Repo, ele será instalado. Caso contrário, listaria o repositório de que está disponível.
Fred, o Cão Maravilha Mágico,
Isso resulta na conexão com repostos yum remotos quando tudo que eu quero é ver o que está acontecendo na minha máquina local .
Noah Sussman
1

O melhor liner que eu criei para fazer isso (o que é ótimo para usar rapidamente em scripts) é:

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

Por exemplo: se eu atualmente tenho gitinstalado:

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

Isso retornará installed

Se atualmente eu não tenho gitinstalado, o mesmo comando anterior retornará: base/7/x86_64qual é a instalação disponível atualmente paragit

domdambrogia
fonte
Isso resulta na conexão com repostos yum remotos quando tudo que eu quero é ver o que está acontecendo na minha máquina local .
Noah Sussman
11
@NoahSussman para listar todos os pacotes instalados atualmente na sua máquina local que você pode usar yum list installed. A partir daí, você pode usar o grepcomando para obter uma resposta mais precisa do que está procurando. Além disso, se você quiser verificar para um pacote específico você pode acrescentar que para o seu comando - Ex: php70w. yum list installed php70wseria ou lista as informações sobre o pacote instalado ou retornoNo matching Packages to list
domdambrogia
-1

Use o código Python para verificar se um pacote está instalado no python usando o yum:

def is_installed(package_name):
    return "not installed" in commands.getstatusoutput("rpm -q " + package_name)[1]
Eric Leschinski
fonte
não deveria ser assim not in?
Inbar Rose
-2
yum list installed bind >/dev/null ; echo $?

Se o resultado for 0 (zero), o pacote está instalado

Tom Emerson
fonte
Isso é muito lento comparado à rpm -q bindsolução mostrada na resposta de John.
Noah Sussman
Embora talvez o uso yum -C ...seja rápido.
Noah Sussman