Vérifiez si tous les packages répertoriés sont installés dans bash

Mon binary dépend de ces bibliothèques boost et de leurs packageages respectifs:

NAME | PACKAGE: --------------------------------------+----------------------------------- libboost_serialization.so.1.55.0 | libboost-serialization1.55.0 libboost_thread.so.1.55.0 | ibboost-thread1.55.0 libboost_date_time.so.1.55.0 | libboost-date-time1.55.0 libboost_signals.so.1.55.0 | libboost-signals1.55.0 

Je voudrais donc définir une list de packages:

 boostlibnames="libboost-serialization1.55.0 libboost-thread1.55.0 libboost-date-time1.55.0 libboost-signals1.55.0" 

Et maintenant, j'aimerais vérifier s'ils sont tous installés et seulement ensuite lancer l' apt-get install . Je sais que apt va vérifier automatiquement si les packages sont déjà installés, mais je voudrais placer dans une invite à l'user s'il veut installer les bibliothèques manquantes avant de le faire.

Donc y a-t-il une bonne façon de vérifier si toutes les bibliothèques listées (dans la variable comme ci-dessus) sont installées?

La command dpkg -s renvoie l'état des packages installés. Par exemple, sur mon système, si je l'exécute pour firefox qui est installé et nedit qui ne l'est pas, j'obtiens:

 $ dpkg -s firefox Package: firefox Status: install ok installed Priority: optional Section: web Installed-Size: 94341 Maintainer: Clement Lefebvre <root@linuxmint.com> Architecture: amd64 Version: 41.0~linuxmint1+betsy Replaces: firefox-l10n-af, firefox-l10n-ar, firefox-l10n-be, firefox-l10n-bg, firefox-l10n-bn-bd, firefox-l10n-ca, firefox-l10n-cs, firefox-l10n-da, firefox-l10n-de, firefox-l10n-el, firefox-l10n-en-gb, firefox-l10n-en-us, firefox-l10n-eo, firefox-l10n-es, firefox-l10n-et, firefox-l10n-eu, firefox-l10n-fa, firefox-l10n-fi, firefox-l10n-fr, firefox-l10n-fy, firefox-l10n-gl, firefox-l10n-gu, firefox-l10n-he, firefox-l10n-hi, firefox-l10n-hr, firefox-l10n-hu, firefox-l10n-id, firefox-l10n-is, firefox-l10n-it, firefox-l10n-ja, firefox-l10n-kn, firefox-l10n-ko, firefox-l10n-lt, firefox-l10n-lv, firefox-l10n-nb, firefox-l10n-nl, firefox-l10n-nn, firefox-l10n-pl, firefox-l10n-pt, firefox-l10n-pt-br, firefox-l10n-ro, firefox-l10n-ru, firefox-l10n-sk, firefox-l10n-sl, firefox-l10n-sq, firefox-l10n-sr, firefox-l10n-sv, firefox-l10n-th, firefox-l10n-tr, firefox-l10n-uk, firefox-l10n-zh Provides: gnome-www-browser, www-browser Breaks: firefox-l10n-en-us Description: The Firefox web browser The Mozilla Firefox Web Browser. $ dpkg -s nedit dpkg-query: package 'nedit' is not installed and no information is available Use dpkg --info (= dpkg-deb --info) to examine archive files, and dpkg --contents (= dpkg-deb --contents) to list their contents. 

Ainsi, vous pouvez utiliser cette command pour vérifier si un package est installé:

 #!/usr/bin/env bash run_install() { ## Prompt the user read -p "Do you want to install missing libraries? [Y/n]: " answer ## Set the default value if no answer was given answer=${answer:Y} ## If the answer matches y or Y, install [[ $answer =~ [Yy] ]] && apt-get install ${boostlibnames[@]} } boostlibnames=("libboost-serialization1.55.0" "libboost-thread1.55.0" "libboost-date-time1.55.0" "libboost-signals1.55.0" "nedit") ## Run the run_install function if sany of the libraries are missing dpkg -s "${boostlibnames[@]}" >/dev/null 2>&1 || run_install 

Ce qui suit vous donnera une list de tous les packages pertinents qui ne sont pas installés:

 dpkg -l $boostlibnames 2>&1 | awk '{if (/^D|^\||^\+/) {next} else if(/^dpkg-query:/) { print $6} else if(!/^[hi]i/) {print $2}}' 

Ceci saute les lignes d'en-tête de dpkg -l , puis affiche les lignes où dpkg-query se plaint d'un package inconnu, et les lignes AND ne commencent pas par hi ou ii (Hold Inst ou Inst Inst).

Habituellement, je ferais quelque chose comme awk 'NR<=5 {next} ; ...' awk 'NR<=5 {next} ; ...' ou sed -e '1,5d' pour se débarrasser des lignes d'en-tête de dpkg -l mais dans ce cas nous redirigeons stderr vers stdout afin d'intercepter les plaintes de dpkg-query ainsi que de dpkg -l 's, donc nous ne pouvons pas simplement supprimer les 5 premières lignes.

Cela indique que les packages n'ont jamais été installés, supprimés, purgés ou que l'installation a échoué / partiellement terminée en raison d'une erreur.