Comment savoir si un paquet est installé via yum dans un script bash?
77
J'essaie d'écrire un script qui installe des packages, mais s'il échoue ultérieurement, le script annule ce qu'il a installé. Bien sûr, si l'utilisateur a déjà installé un paquet, je ne veux pas le désinstaller. Comment mon script peut-il savoir si un paquet a déjà été installé via yum?
J'ai trouvé ce qui suit sur une question semi-liée à StackOverflow ; la réponse dont j'avais besoin ne répondait pas vraiment à la question (et n'a pas été sélectionnée comme bonne réponse); j'ai donc pensé la poster ici pour que les autres le trouvent plus facilement.
yum list installed PACKAGE_NAME
Cette commande renvoie une sortie lisible par l’homme, mais 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-beepbopboopil renverra un "1" exactement comme yum list installed traceroutesi traceroute n'était pas installé). 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
trueelse
falsefi}
l'utilisation serait
if isinstalled $package; then echo "installed"; else echo "not installed"; fi
MODIFIER:
Les returninstructions remplacées par des appels à trueet falsequi aident à rendre la fonction plus lisible / intuitive, tout en renvoyant les valeurs attendues par bash (c'est-à-dire 0 pour true, 1 pour false).
Si vous ne recherchez qu'un package dans votre script, il peut être préférable de tester yum list installeddirectement, mais (à mon humble avis), la fonction facilite la compréhension de ce qui se passe et sa syntaxe est beaucoup plus simple à retenir que yumpour toutes les redirections. pour supprimer sa sortie.
Vous n'avez pas besoin de vérifier manuellement la valeur de $?, mais juste d'envelopper la commande dans une condition:if yum list installed "$package" >/dev/null 2>&1; then [...]
Chris Down le
1
Je pense que vos déclarations d'écho sont inversées, non? isInstalledrenvoie 1 si le paquet est installé; mais 1 est évalué à false dans bash, donc "non installé" est répercuté.
FGreg
@FGreg good call ... J'ai remplacé les returninstructions par des appels à trueand false, afin que la fonction soit facilement lisible tout en renvoyant le résultat attendu par bash.
Doktor J
5
OMG, c’est le 21ème siècle, ne peuvent-ils pas avoir la bonne option pour savoir si un paquet est installé, alors je n’ai pas de fonctions d’écriture ni de doublures!?
Sunil D.
21
Ne remplit pas exactement la condition préalable de la question "via yum" mais plus rapidement 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" s'il est installé et "1" s'il ne l'est pas.
#!/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 si celui-ci est installé.
Vous pouvez également lire la valeur $?de retour de yum. Doit être égal à 0 si tout fonctionne ou positif en fonction du type de problèmes rencontrés par yum. C'est un bon moyen si vous souhaitez prendre des mesures différentes en cas d'échec.
$?
, mais juste d'envelopper la commande dans une condition:if yum list installed "$package" >/dev/null 2>&1; then [...]
isInstalled
renvoie 1 si le paquet est installé; mais 1 est évalué à false dans bash, donc "non installé" est répercuté.return
instructions par des appels àtrue
andfalse
, afin que la fonction soit facilement lisible tout en renvoyant le résultat attendu par bash.Ne remplit pas exactement la condition préalable de la question "via yum" mais plus rapidement que "yum -q list" est:
qui renvoie le nom exact de la version éventuellement installée ainsi que le code d'erreur "0" s'il est installé et "1" s'il ne l'est pas.
la source
rpm
est le gestionnaire de paquets local.yum
est pour traiter les paquets dans les dépôts distantsOneliner plus simple:
la source
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 si celui-ci est installé.
la source
Vous pouvez également lire la valeur
$?
de retour de yum. Doit être égal à 0 si tout fonctionne ou positif en fonction du type de problèmes rencontrés par yum. C'est un bon moyen si vous souhaitez prendre des mesures différentes en cas d'échec.la source