Como posso saber se um pacote está instalado via yum em um script bash?

76

Estou tentando escrever um script que instala pacotes, mas se ele falhar a qualquer momento posteriormente, o script reverte o que foi instalado. Obviamente, se o usuário já instalou um pacote anteriormente, não quero desinstalá-lo. Como o meu script pode saber se um pacote foi instalado anteriormente via yum?

Doktor J
fonte

Respostas:

77

Encontrei o seguinte em uma pergunta semi-relacionada ao StackOverflow ; a resposta de que eu precisava não respondeu muito bem à pergunta lá (e não foi selecionada como a resposta correta), então achei que a publicaria aqui para que outras pessoas encontrassem mais fácil.

yum list installed PACKAGE_NAME

Este comando retorna uma saída legível por humanos, mas, mais importante, retorna um código de status de saída; 0 indica que o pacote está instalado, 1 indica que o pacote não está instalado (não verifica se o pacote é válido, yum list installed herpderp-beepbopboopretornará um "1" da mesma forma que yum list installed traceroutefará se você não tiver o traceroute instalado). Você pode verificar posteriormente "$?" para este código de saída.

Como a saída é um pouco contra-intuitiva, usei a versão "condensada" do @Chris Downs abaixo em uma função de wrapper para tornar a saída mais "lógica" (ou seja, 1 = instalado 0 = não instalado):

function isinstalled {
  if yum list installed "$@" >/dev/null 2>&1; then
    true
  else
    false
  fi
}

uso seria

if isinstalled $package; then echo "installed"; else echo "not installed"; fi

EDITAR:

Instruções substituídas returnpor chamadas para truee falseque ajudam a tornar a função mais legível / intuitiva, retornando os valores esperados pelo bash (ou seja, 0 para verdadeiro, 1 para falso).

Se você está apenas procurando um pacote em seu script, pode ser melhor testar yum list installeddiretamente, mas (IMHO) a função facilita a compreensão do que está acontecendo, e sua sintaxe é muito mais fácil de lembrar do que yumcom todos os redirecionamentos para suprimir sua saída.

Doktor J
fonte
2
Você não precisa verificar manualmente o valor $?, só embrulhar o comando em uma condicional:if yum list installed "$package" >/dev/null 2>&1; then [...]
Chris Baixo
1
Eu acho que suas declarações de eco são invertidas, não? isInstalledretorna 1 se o pacote estiver instalado; mas 1 é avaliado como falso no bash para que "não instalado" seja ecoado.
FGreg 9/09/15
@FGreg boa chamada ... Substituí as returninstruções por chamadas para truee false, portanto, a função é facilmente legível, mas retorna a saída que o bash espera.
Doktor J
5
OMG, é o século 21, eles não podem ter uma opção adequada para saber se um pacote está instalado, para que eu não tenha funções de gravação ou liners !?
Sunil D.
21

Não é exatamente o cumprimento da pré-condição da pergunta "via yum", mas é mais rápido que a "lista yum -q":

rpm -q <package_name>

que retorna o nome exato da versão possivelmente instalada, bem como o código de erro "0" se instalado e "1" se não estiver.

Gerald Schade
fonte
+1 porque este é mais rápido
Freddie Fabregas
Definitivamente mais rápido, porque rpmé o gerenciador de pacotes local. yumé para lidar com pacotes em repositórios remotos
Sergiy Kolodyazhnyy 25/01
9

Oneliner mais simples:

yum -q list installed packageX &>/dev/null && echo "Installed" || echo "Not installed"
Zlemini
fonte
0

Um script útil para o yum:

#!/bin/sh pckarr=(wget mlocate bind-utils ANY_RANDOM_PACKAGE_NAME) yum update -y for i in ${pckarr[*]} do isinstalled=$(rpm -q $i) if [ ! "$isinstalled" == "package $i is not installed" ]; then echo Package $i already installed else echo $i is not INSTALLED!!!! yum install $i -y fi done updatedb

No array pckarr, liste os pacotes que você deseja instalar ou verifique se ele está instalado.

Ashish K Srivastava
fonte
0

Você também pode ler o valor de retorno $?do yum. Deve ser 0 se tudo funcionou ou foi positivo, dependendo do tipo de problema que você teve. Esta é uma boa maneira se você quiser executar ações diferentes se algo falhar.

Febre
fonte