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 existe-t-il une solution plus élégante?
command -v <command>
; nonwhich <command>
. Voir également Vérifier si un programme existe à partir d'un script Bash .Réponses:
Pour vérifier si a
packagename
été installé, tapez:Vous pouvez également utiliser
dpkg-query
une sortie plus nette pour votre usage et accepter également les caractères génériques.Pour trouver le package auquel appartient le
command
, essayez:Pour plus de détails, consultez l'article Découvrez si le package est installé dans Linux et la feuille de triche dpkg .
la source
if
utilisation. Je recherche également uneif
utilisation.dpkg -s
retourne 1 sur les paquets manquants et 0 sinon, comme il se doit. Quelle était la différence sur les versions antérieures (ou récentes)?dpkg -s
retourne zéro si un paquet a été installé puis supprimé - dans ce cas c'estStatus: deinstall ok config-files
ou similaire, donc c'est "ok" - donc pour moi, ce n'est pas un test sûr.dpkg-query -l
ne semble pas non plus retourner un résultat utile dans ce cas.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 en constatant que le package est manquant, comme simplement quitter avec un code d'erreur.
Si le script s'exécute dans une interface graphique (par exemple, il s'agit d'un script Nautilus), vous voudrez probablement remplacer l'invocation 'sudo' par une invocation 'gksudo'.
la source
--force-yes
semble une mauvaise idée. Depuis la page de manuel: "C'est une option dangereuse qui fera continuer apt-get sans demander si elle fait quelque chose de potentiellement dangereux. Elle ne doit pas être utilisée sauf dans des situations très spéciales. L'utilisation de --force-yes peut potentiellement détruire votre système ! " L'utiliser dans un script ne fait qu'empirer les choses.Ce one-liner renvoie 1 (installé) ou 0 (non installé) pour le package 'nano'.
même si le package n'existe pas / n'est pas disponible.
L'exemple ci-dessous installe le package 'nano' s'il n'est pas installé.
la source
dpkg-query -W -f='${Status}' MYPACKAGE | grep -q -P '^install ok installed$'; echo $?
grep -P
d'une simple expression régulière comme ça.if ! dpkg-query -W -f='${Status}' nano | grep "ok installed"; then apt install nano; fi
- Pas besoin d'utilisergrep -c
, utilisez simplement le statut de sortie degrep
dpkg -s
utilisation programmatique avec installation automatiqueJ'aime
dpkg -s
car il se termine avec le statut1
si aucun des packages n'est installé, ce qui facilite l'automatisation:man dpkg
ne documente malheureusement pas le statut de sortie, mais je pense qu'il devrait être raisonnablement sûr de s'y fier:Une chose à noter est que l'exécution:
ne supprime pas nécessairement tous les fichiers immédiatement pour certains packages (mais le fait pour d'autres, vous ne savez pas pourquoi?), et marque simplement le package pour la suppression.
Dans cet état, le package semble être encore utilisable, et comme ses fichiers sont toujours présents, mais il est marqué pour suppression plus tard.
Par exemple, si vous exécutez:
puis:
les deux premières
echo $?
sorties0
, seule la troisième sort1
la sortie du premier
dpkg -s certbot
contient:tandis que le second dit:
et il ne disparaît qu'après purge:
le fichier
/etc/logrotate.d/certbot
est toujours présent dans le système aprèsapt remove
, mais pas après--purge
.Cependant, le fichier
/usr/lib/python3/dist-packages/certbot/reporter.py
est toujours présent même après--purge
.Je ne comprends pas pourquoi, mais avec le
hello
package le deuxièmedpkg
aprèsapt remove
montre qu'il a déjà été supprimé sans--purge
:Les documentations sont également très peu claires, par exemple:
n'a pas supprimé
certbot
quand il a été marqué commedeinstall
, même si celaman apt-get
semble indiquer que:Voir également:
Testé sur Ubuntu 19.10.
apt
Paquet PythonIl existe un package Python 3 préinstallé appelé
apt
dans Ubuntu 18.04 qui expose une interface apt Python!Un script qui vérifie si un package est installé et l'installe sinon peut être vu à: Comment installer un package à l'aide de l'API python-apt
Voici une copie pour référence:
Vérifiez si un exécutable est à la
PATH
placeVoir: Comment puis-je vérifier si un programme existe à partir d'un script Bash?
la source
sudo apt install hello; dpkg -s hello; echo $?; sudo apt remove hello; dpkg -s hello; echo $?
. Pouvez-vous fournir plus de détails?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 packages PPA ont un résultat différent.
Paquet de référentiel Debian natif non installé:
Package PPA enregistré sur l'hôte et installé:
Package PPA enregistré sur l'hôte mais non installé:
Également publié sur: /superuser/427318/test-if-a-package-is-installed-in-apt/427898
la source
UpAndAdam a écrit:
D'après mon expérience, vous pouvez vous fier aux codes de sortie de dkpg.
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 que j'ai trouvée était:
Fonctionne bien pour moi ...
la source
apt-get remove <package>
,dpkg -s <package>
renvoie toujours 0, même si le package estdeinstalled
Cela semble assez bien fonctionner.
0
s'il n'est pas installé ou un certain nombre> 0
s'il est installé.la source
grep | wc -l
est un contre-modèle. Pour vérifier si quelque chose existe, vous voulez simplementgrep -q
. Pour réellement compter les occurrences (ce qui est rarement utile dans ce type de scénario), utilisezgrep -c
.dpkg -s zip | grep -c "Package: zip"
? (en utilisant zip comme exemple de package)grep -q 'Package: zip'
renvoyer un code de sortie qui indique si le résultat a été trouvé sans imprimer quoi que ce soit.Je me suis installé sur un basé sur la réponse de Nultyi :
Fondamentalement, le message d'erreur de
dpkg --get-selections
est beaucoup plus facile à analyser que la plupart des autres, car il n'inclut pas de statuts tels que "désinstaller". Il peut également vérifier plusieurs packages simultanément, ce que vous ne pouvez pas faire avec seulement des codes d'erreur.Explication / exemple:
Ainsi, grep supprime les packages installés de la liste et awk extrait les noms des packages du message d'erreur, ce
MISSING='python3-venv python3-dev jq'
qui peut être inséré de manière triviale dans une commande d'installation.Je ne publie pas aveuglément
apt-get install $PACKAGES
car, comme mentionné dans les commentaires, cela peut mettre à niveau de manière inattendue des packages que vous n'aviez pas prévus; pas vraiment une bonne idée pour les processus automatisés qui devraient être stables.la source
[[ ! -z $MISSING ]] && sudo apt-get install $MISSING
J'ai trouvé que toutes les solutions ci-dessus peuvent produire un faux positif si un package est installé puis supprimé, mais le package d'installation reste sur le système.
Pour répliquer: installer le package
apt-get install curl
Supprimer le package
apt-get remove curl
Testez maintenant les réponses ci-dessus.
La commande suivante semble résoudre cette condition:
dpkg-query -W -f='${Status}\n' curl | head -n1 | awk '{print $3;}' | grep -q '^installed$'
Cela se traduira par une installation définitive ou non installée
la source
config-files
- donc je pense qu'une finale| grep -q "installed"
est vraiment nécessaire pour obtenir un code de sortie fonctionnel.| grep -q '^installed$'
Il semble que de nos jours
apt-get
a une option--no-upgrade
qui fait juste ce que le PO veut:Page de manuel de https://linux.die.net/man/8/apt-get
Vous pouvez donc utiliser
et
package
ne sera installé que si ce n'est pas le cas.la source
la source
command -v <command>
; nonwhich <command>
. Voir également Vérifier si un programme existe à partir d'un script Bash .Cela suffira.
apt-get install
est idempotent.la source
apt-get install
sur un package n'est pas souhaitable lorsque le package est déjà installé, même si la commande elle-même est idempotente. Dans mon cas, j'installe un package sur un système distant avec le module brut d'Ansible, qui signalera le système comme modifié à chaque fois si j'exécuteapt-get install
sans discernement. Un conditionnel résout ce problème.Utilisation:
S'il n'est pas installé, il affichera:
Sinon, il affichera:
la source
Cette fonctionnalité existe déjà dans Ubuntu et Debian, dans le
command-not-found
package.la source
command-not-found
est un assistant interactif, pas un outil pour vous assurer que vous disposez des dépendances souhaitées. Bien sûr, la bonne façon de déclarer les dépendances est de mettre votre logiciel dans un paquet Debian et de remplir correctement laDepends:
déclaration dans ledebian/control
fichier du paquet .semble être le moyen le plus simple de le faire en dehors de dpkg et des outils apt- * plus anciens
la source
la source
command -v <command>
; nonwhich <command>
. Voir également Vérifier si un programme existe à partir d'un script Bash .J'avais une exigence similaire lors de l'exécution de test localement plutôt que dans docker. Fondamentalement, je voulais uniquement installer les fichiers .deb trouvés s'ils n'étaient pas déjà installés.
Je suppose que le seul problème que je peux voir est qu'il ne vérifie pas le numéro de version du package, donc si le fichier .deb est une version plus récente, cela n'écrasera pas le package actuellement installé.
la source
Pour Ubuntu, apt fournit un moyen assez décent de le faire. Voici un exemple pour Google Chrome:
apt -qq list google-chrome-stable 2>/dev/null | grep -qE "(installed|upgradeable)" || apt-get install google-chrome-stable
Je redirige la sortie d'erreur vers null car apt met en garde contre l'utilisation de son "cli instable". Je soupçonne que le package de liste est stable, donc je pense que c'est correct de jeter cet avertissement. Le -qq rend apt super silencieux.
la source
Cette commande est la plus mémorable:
S'il est installé, il affiche:
Sinon, il imprime
Cela a été testé sur Ubuntu 12.04.1 (Precise Pangolin).
la source
dpkg --get-selections <package-name>
ne définit pas le code de sortie sur non nul lorsque le package est introuvable.Beaucoup de choses ont été dites mais pour moi la manière la plus simple est:
la source
Dans Bash:
Notez que vous pouvez avoir une chaîne avec plusieurs packages dans PKG.
la source
J'utilise la manière suivante:
la source