Vérifier si un paquet est installé et ensuite de l'installer si ce n'est pas
je travaille sur un système Ubuntu et actuellement c'est ce que je fais:
if ! which command > /dev/null; then
echo -e "Command not found! Install? (y/n) c"
read
if "$REPLY" = "y"; then
sudo apt-get install command
fi
fi
est-ce ce que la plupart des gens feraient? Ou est-il une solution plus élégante?
18 réponses
pour vérifier si packagename
a été installé, tapez:
dpkg -s <packagename>
vous pouvez également utiliser dpkg-query
qui a une sortie plus nette pour votre but, et accepte les cartes wild, aussi.
dpkg-query -l <packagename>
pour trouver quel paquet possède le command
, essayez:
dpkg -S `which <command>`
pour plus de détails, voir l'article pour savoir si le paquet est installé sous Linux et dpkg feuille de triche .
pour être un peu plus explicite, voici un peu de script bash qui vérifie un paquet et l'installe si nécessaire. Bien sûr, vous pouvez faire d'autres choses lorsque vous constatez que le paquet est manquant, comme simplement quitter avec un code d'erreur.
PKG_OK=$(dpkg-query -W --showformat='${Status}\n' the.package.name|grep "install ok installed")
echo Checking for somelib: $PKG_OK
if [ "" == "$PKG_OK" ]; then
echo "No somelib. Setting up somelib."
sudo apt-get --force-yes --yes install the.package.name
fi
si le script s'exécute dans une GUI (par exemple c'est un script Nautilus), vous voudrez probablement remplacer l'invocation 'sudo' par une 'gksudo'.
cette doublure renvoie 1 (installé) ou 0 (non installé) pour le paquet 'nano'..
$(dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed")
, même si le paquet n'existe pas / n'est pas disponible.
l'exemple ci-dessous installe le paquet 'nano' s'il n'est pas installé..
if [ $(dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed") -eq 0 ];
then
apt-get install nano;
fi
j'offre cette mise à jour depuis Qu'Ubuntu a ajouté son" Personal Package Archive " (PPA) juste au moment où cette question a été répondue, et les paquets PPA ont un résultat différent.
-
le paquet de dépôt Debian natif n'est pas installé:
~$ dpkg-query -l apache-perl ~$ echo $? 1
-
paquet PPA enregistré sur l'hôte et installé:
~$ dpkg-query -l libreoffice ~$ echo $? 0
-
paquet PPA enregistré sur l'hôte mais non installé:
~$ dpkg-query -l domy-ce ~$ echo $? 0 ~$ sudo apt-get remove domy-ce [sudo] password for user: Reading package lists... Done Building dependency tree Reading state information... Done Package domy-ce is not installed, so not removed 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
également publié sur: https://superuser.com/questions/427318/test-if-a-package-is-installed-in-apt/427898
UpAndAdam a écrit:
cependant, vous ne pouvez pas simplement compter sur les codes de retour ici pour le script
Dans mon expérience peut s'appuient sur dkpg de codes de sortie.
le code de retour de dpkg-s est 0 si le paquet est installé et 1 si ce n'est pas le cas, donc la solution la plus simple I trouvé était:
dpkg -s <pkg-name> 2>/dev/null >/dev/null || sudo apt-get -y install <pkg-name>
me va très bien...
Cela semble fonctionner assez bien.
$ sudo dpkg-query -l | grep <some_package_name> | wc -l
- il retourne
0
s'il n'est pas installé ou un numéro quelconque> 0
s'il est installé.
j'ai trouvé que toutes les solutions ci-dessus peuvent produire un faux positif si un paquet est installé et ensuite enlevé alors que le paquet d'installation reste sur le système.
pour répliquer:
Installer le paquet apt-get install curl
Supprimer le paquet apt-get remove curl
Maintenant tester les réponses ci-dessus.
la commande suivante semble résoudre cette condition:
dpkg-query -W -f='${Status}\n' curl | head -n1 | awk '{print ;}' | grep -q '^installed$'
This résultat sera définitif installé ou non installé
$name="rsync"
[ `which $name` ] $$ echo "$name : installed" || sudo apt-get install -y $name
ça ira. apt-get install
est idempotent.
sudo apt-get install command
utiliser:
apt-cache policy <package_name>
S'il n'est pas installé, il affichera:
Installed: none
sinon il montrera:
Installed: version
je me suis installé sur l'une basée sur la Nultyi la réponse de :
MISSING=$(dpkg --get-selections $PACKAGES 2>&1 | grep -v 'install$' | awk '{ print }')
# Optional check here to skip bothering with apt-get if $MISSING is empty
sudo apt-get install $MISSING
Fondamentalement, le message d'erreur dpkg --get-selections
est beaucoup plus facile à analyser que la plupart des autres, puisqu'il n'inclut pas les statuts comme "désinstaller". Il peut aussi vérifier plusieurs paquets simultanément, ce que vous ne pouvez pas faire avec juste des codes d'erreur.
explication/ exemple:
$ dpkg --get-selections python3-venv python3-dev screen build-essential jq
dpkg: no packages found matching python3-venv
dpkg: no packages found matching python3-dev
screen install
build-essential install
dpkg: no packages found matching jq
ainsi grep supprime installé paquets de la liste, et awk sort les noms de paquets du message d'erreur, ce qui donne MISSING='python3-venv python3-dev jq'
, qui peut être inséré trivialement dans une commande install.
Je ne publie pas aveuglément un apt-get install $PACKAGES
parce que comme mentionné dans les commentaires, cela peut mettre à jour de façon inattendue les paquets que vous n'aviez pas prévu; ce n'est pas vraiment une bonne idée pour les processus automatisés qui sont censés être stables.
cette fonctionnalité existe déjà dans Ubuntu et Debian, dans le paquet command-not-found
.
apt list [packagename]
semble être le moyen le plus simple de le faire en dehors de dpkg et des anciens apt - * tools
which <command>
if [ $? == 1 ]; then
<pkg-manager> -y install <command>
fi
Cette commande est la plus mémorable:
dpkg --get-selections <package-name>
si elle est installée, elle imprime:
installer
sinon il imprime
Aucun paquet trouvé correspondant à
.
cela a été testé sur Ubuntu 12.04.1 (Pangolin précis).
Pour Ubuntu, apt fournit une façon assez décente de le faire. Ci-dessous un exemple pour google chrome:
if apt -qq list google-chrome-stable 2>/dev/null | grep -q installed ; then
apt-get install google-chrome-stable
fi
je redirige la sortie d'erreur vers null car apt avertit de ne pas utiliser son"cli instable". Je pense que le paquet de liste est stable donc je pense qu'il est correct de jeter cet avertissement. Le-qq rend apt super calme.
beaucoup de choses ont été dites mais pour moi la manière la plus simple est:
dpkg -l | grep packagename
j'ai eu une exigence similaire lorsque j'ai exécuté l'essai localement au lieu de dans docker. En gros, je voulais juste en installer un .les fichiers deb trouvés s'ils n'étaient pas déjà installés.
# If there are .deb files in the folder, then install them
if [ `ls -1 *.deb 2> /dev/null | wc -l` -gt 0 ]; then
for file in *.deb; do
# Only install if not already installed (non-zero exit code)
dpkg -I ${file} | grep Package: | sed -r 's/ Package:\s+(.*)//g' | xargs dpkg -s
if [ $? != 0 ]; then
dpkg -i ${file}
fi;
done;
else
err "No .deb files found in '$PWD'"
fi
je suppose que le seul problème que je peux voir est qu'il ne vérifie pas le numéro de version du paquet donc si .le fichier deb est une version plus récente, alors cela n'écraserait pas le paquet actuellement installé.