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?
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
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.
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.
Oneliner plus simple:
yum -q list installed packageX &>/dev/null && echo "Installed" || echo "Not installed"
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.
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.