J'ai une simple exigence. Je veux définir plusieurs variables qui correspondront à n'importe quel nombre de packages donnés que je veux installer via un script shell.
Exemple de code ci-dessous:
MISC="shutter pidgin"
WEB="apache2 mongodb"
for pkg in $MISC $WEB; do
if [ "dpkg-query -W $pkg | awk {'print $1'} = """ ]; then
echo -e "$pkg is already installed"
else
apt-get -qq install $pkg
echo "Successfully installed $pkg"
fi
done
Tout fonctionne un peu, mais la logique semble imparfaite car elle n'installe pas de manière fiable les packages que je veux. Il indique soit qu'ils ont déjà été installés, soit qu'il essaie d'installer des packages qui ont déjà été installés précédemment.
J'ai également essayé avec command -v
ou ce qui suit:
if [ "dpkg -l | awk {'print $2'} | grep --regexp=^$pkg$ != """ ]; then
Et même avec les drapeaux -n
et -z
pour vérifier si la chaîne retournée était vide. Je suis sûr que je manque de bon sens ici.
Avez-vous une idée de ce que je pourrais faire pour m'assurer qu'un package est réellement installé ou non?
Merci!
apt-get install
des packages installés? Vous pourriez simplement appelerapt-get install $MISC $WEB
.Réponses:
Il vous suffit essentiellement de remplacer la
if
condition parIl n'est pas possible de l'utiliser
dpkg-query
, car il renvoie vrai également pour les packages supprimés mais non purgés.Je suggère également de vérifier le code de sortie de
apt-get
avant de donner le message réussi:la source
&>
-il?/dev/null
dans ce cas), car nous n'avons pas besoin de la sortie, seulement du code de sortie. Cela ne fonctionne que dansbash
(la première ligne du script doit être#!/bin/bash
) sinon utilisez>/dev/null 2>&1
.Vous pouvez le tester par dpkg-query:
Notez que * et? sont des caractères génériques, s'ils apparaissent dans $ pkg. Je suppose que dpkg-query peut afficher "reinst-required installed" au lieu de "ok installed", si le package est cassé et doit être réinstallé par une commande
apt-get install --reinstall
qui peut également être utilisée pour installer de nouveaux packages.la source
la source