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?
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
trueelse
falsefi}
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.
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.
#!/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.
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.
$?
, só embrulhar o comando em uma condicional:if yum list installed "$package" >/dev/null 2>&1; then [...]
isInstalled
retorna 1 se o pacote estiver instalado; mas 1 é avaliado como falso no bash para que "não instalado" seja ecoado.return
instruções por chamadas paratrue
efalse
, portanto, a função é facilmente legível, mas retorna a saída que o bash espera.Não é exatamente o cumprimento da pré-condição da pergunta "via yum", mas é mais rápido que a "lista yum -q":
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.
fonte
rpm
é o gerenciador de pacotes local.yum
é para lidar com pacotes em repositórios remotosOneliner mais simples:
fonte
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.
fonte
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.fonte