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?

185
demandé sur Peter Mortensen 2009-08-19 10:18:50

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 .

279
répondu Török Gábor 2009-08-19 06:39:45

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'.

65
répondu Urhixidur 2012-05-03 20:44:36

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
58
répondu Seb 2014-03-23 15:22:03

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.

  1. le paquet de dépôt Debian natif n'est pas installé:

    ~$ dpkg-query -l apache-perl
    ~$ echo $?
    1
    
  2. paquet PPA enregistré sur l'hôte et installé:

    ~$ dpkg-query -l libreoffice
    ~$ echo $?
    0
    
  3. 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

11
répondu tahoar 2018-01-26 15:38:41

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...

7
répondu rocka84 2014-09-22 13:02:16

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é.
4
répondu sandman 2017-09-01 21:56:28

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é

3
répondu Mark 2016-10-04 12:28:49
$name="rsync"

[ `which $name` ] $$ echo "$name : installed" || sudo apt-get install -y $name
2
répondu Kyprio 2015-09-11 14:58:08

ça ira. apt-get install est idempotent.

sudo apt-get install command
2
répondu David Baucum 2016-04-05 00:00:16

utiliser:

apt-cache policy <package_name>

S'il n'est pas installé, il affichera:

Installed: none

sinon il montrera:

Installed: version
2
répondu Mohammed Noureldin 2017-09-01 21:59:07

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.

2
répondu Izkata 2018-02-05 04:15:01

cette fonctionnalité existe déjà dans Ubuntu et Debian, dans le paquet command-not-found .

1
répondu camh 2009-08-19 09:15:52
apt list [packagename]

semble être le moyen le plus simple de le faire en dehors de dpkg et des anciens apt - * tools

1
répondu Erich 2017-07-17 23:31:22
which <command>
if [ $? == 1 ]; then
    <pkg-manager> -y install <command>
fi
0
répondu irock.dev 2017-07-19 15:38:42

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).

0
répondu iNulty 2017-09-01 21:57:35

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.

0
répondu carlin.scott 2017-12-06 18:45:56

beaucoup de choses ont été dites mais pour moi la manière la plus simple est:

dpkg -l | grep packagename
0
répondu freedev 2018-07-31 07:49:08

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é.

0
répondu Craig 2018-08-21 18:47:38