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?

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.


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.


+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"

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.