web-dev-qa-db-fra.com

Comment savoir si un package est installé via yum dans un script bash?

J'essaie d'écrire un script qui installe des packages, mais s'il échoue à un moment donné plus tard dans le script, annule tout ce qu'il a installé. Bien sûr, si l'utilisateur a déjà installé un package, je ne veux pas le désinstaller sous lui. Comment mon script peut-il dire si un paquet a déjà été installé via yum?

80
Doktor J

J'ai trouvé ce qui suit sur un semi-apparenté question StackOverflow ; la réponse dont j'avais besoin n'a pas vraiment répondu à la question là-bas (et n'a pas été sélectionnée comme la bonne réponse) alors j'ai pensé que je la posterais ici pour que les autres trouvent plus facile.

yum list installed PACKAGE_NAME

Cette commande renvoie une sortie lisible par l'homme, mais renvoie surtout un code d'état de sortie; 0 indique que le package est installé, 1 indique que le package n'est pas installé (ne vérifie pas si le package est valide, donc yum list installed herpderp-beepbopboop renverra un "1" tout comme yum list installed traceroute le fera si vous n'avez pas installé traceroute). Vous pouvez ensuite vérifier "$?" pour ce code de sortie.

Comme la sortie est quelque peu contre-intuitive, j'ai utilisé la version "condensée" de @Chris Downs ci-dessous dans une fonction wrapper pour rendre la sortie plus "logique" (c'est-à-dire 1 = installé 0 = non installé):

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

l'utilisation serait

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

ÉDITER:

Instructions return remplacées par des appels à true et false qui aident à rendre la fonction plus lisible/intuitive, tout en renvoyant les valeurs attendues par bash (ie 0 pour true, 1 pour false) .

Si vous recherchez un seul package dans votre script, vous feriez peut-être mieux de tester yum list installed directement, mais (à mon humble avis) la fonction facilite la compréhension de ce qui se passe, et sa syntaxe est beaucoup plus facile à retenir que yum avec toutes les redirections pour supprimer sa sortie.

80
Doktor J

Ne remplissant pas exactement la condition préalable de la question "via yum" mais plus rapide que "yum -q list" est:

rpm -q <package_name>

qui renvoie le nom exact de la version éventuellement installée ainsi que le code d'erreur "0" si installé et "1" sinon.

23
Gerald Schade

Oneliner plus simple:

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

Un script pratique pour miam:

#!/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

Dans le tableau pckarr, répertoriez les packages que vous souhaitez installer ou vérifiez s'ils sont installés.

0

Vous pouvez également lire la valeur de retour $? de miam. Doit être 0 si tout a fonctionné ou positif selon le type de problèmes que vous avez rencontrés. C'est un bon moyen si vous souhaitez entreprendre différentes actions en cas d'échec.

0
Fever