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

9

Mon binaire dépend de ces bibliothèques de boost et des packages 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 liste de packages:

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

Et maintenant, je voudrais vérifier si elles sont toutes installées et ensuite seulement s'exécuter apt-get install. Je sais qu'apt vérifiera automatiquement si les packages sont déjà installés, mais je voudrais indiquer à l'utilisateur s'il souhaite installer les bibliothèques manquantes avant de le faire.

Existe-t-il donc un bon moyen de vérifier si toutes les bibliothèques listées (en variable comme ci-dessus) sont installées?

Tomáš Zato - Réintégrer Monica
la source
Créez un paquet Debian approprié et laissez apt gérer les dépendances
ivanivan
@ivanivan C'est une application interne à l'entreprise et bien sûr pas open-source.
Tomáš Zato - Reinstate Monica
Cela ne signifie pas que vous devez distribuer le fichier deb ou autre chose au-delà de votre entreprise interne ... utilisez simplement la résolution des dépendances des systèmes d'emballage. Heck, utilisez la méthode sur ce q / a pour créer un faux paquet pour installer les deps - unix.stackexchange.com/questions/318117/…
ivanivan

Réponses:

13

La dpkg -scommande renvoie l'état des packages installés. Par exemple, sur mon système, si je l'exécute pour firefoxlequel est installé et neditlequel 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 commande 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
terdon
la source
Existe-t-il un moyen rapide de sauvegarder les résultats? Par exemple. en C / C ++ je ferais installed = installed || isInstalled(libArray[i]). De même, j'aimerais mettre false dans une variable si un ou plusieurs n'étaient pas installés. Je pense que je peux le faire avec if, mais c'est beaucoup de code pour rien.
Tomáš Zato - Rétablir Monica
@ TomášZato oui, mais vous devrez être plus précis. Voulez-vous enregistrer la liste des bibliothèques manquantes? Un seul suffit-il? Personnellement, je vérifierais simplement si tous sont installés et si au moins un ne fonctionne pas apt-get installsur tous. Ceux qui sont installés seront simplement ignorés. Faites-moi savoir ce que vous voulez et je le modifierai. En gros, vous devrez changer le || echo ...pour || installed=1ou quelque chose.
terdon
Je voulais faire exactement ce que vous faites, c'est un effort inutile pour sauvegarder la liste des bibliothèques manquantes. Vérifiez-les tous, et s'il en manque, demandez à apt-get. J'ai déjà fait travailler votre code avec une ifinstruction laide , mais la variable serait préférée. Je prévois de l'envelopper dans une fonction.
Tomáš Zato - Rétablir Monica
@ TomášZato OK, regardez la réponse mise à jour. Je l'ai simplifié un peu car je dpkg -speux vérifier plusieurs packages à la fois.
terdon
1

J'ai fait cette fonction pour un système CentOS aujourd'hui.

#!/bin/bash

# List of the packages that should be present
list=("vim-enhanced" "nano" "expect" "dialog" "epel-release" "yum-utils" "bind-utils")

# Check for the existence of the packages in the system and print to file.txt the packages to be installed
check_list=$(rpm -q "${list[@]}" | grep -e "not installed" | awk 'BEGIN { FS = " " } ; { print $2}' > list.txt)

# Check if the list.txt is empty
grep -q '[^[:space:]]' < list.txt
EMPTY_FILE=$?
# If list.txt is empty there's nothing to do
if [[ $EMPTY_FILE -eq 1 ]]; then

echo "Nothing to do"

else

# If list.txt is not empty it installs the packages in list.txt

for PACKAGES in `cat /your/path/list.txt`; do

  yum install -y $PACKAGES

done

fi

Eh bien, j'ai légèrement modifié la fonction. Plus rapide et il n'a plus besoin de boucle.

#!/bin/bash


list=("vim-enhanced" "nano" "expect" "dialog" "epel-release" "yum-utils" "bind-utils")
check_list=$(rpm -q "${list[@]}" | grep -e "not installed" | awk 'BEGIN { FS = " " } ; { printf $2" "}' > /your/path/to/list.txt)
install=$(cat /your/path/to/list.txt)

grep -q '[^[:space:]]' < /your/path/to/list.txt

EMPTY_FILE=$?

if [[ $EMPTY_FILE -eq 1 ]]; then

echo "Nothing to do"

else

yum install -y $install

fi

L'homologue Debian / Ubuntu:

apt -qq YOUR_LIST_GOES_HERE | grep -v "installed" | awk -F/ '{print $1}' > /your/path/to/list.txt
packages=$(cat /your/path/to/list.txt)
grep -q '[^[:space:]]' < /your/path/to/list.txt
EMPTY_FILE=$?
if [[ $EMPTY_FILE -eq 1 ]]; then
echo "Nothing to do"
else
apt-get  install -y $packages
fi
Claudio Taccogna
la source
0

Ce qui suit vous donnera une liste 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}}' 

Cela ignore dpkg -lles lignes d'en-tête, puis imprime les lignes où dpkg-query se plaint d'un package inconnu, ET les lignes ne commençant pas par hiou ii(Hold Inst ou Install Inst).

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

Cela montrera les packages jamais installés, supprimés, purgés ou où l'installation a échoué / partiellement terminée en raison d'une erreur.

cas
la source
0

J'utilise le code suivant dans mon travail appelé Easy Bash , qui aide à installer rapidement les packages les plus populaires sur les serveurs Ubuntu. Ce code vérifiera les packages listés installés ou non.

#!/usr/bin/env bash

packages=("curl" "gnupg2" "ca-certificates" "lsb-release")

for pkg in ${packages[@]}; do

    is_pkg_installed=$(dpkg-query -W --showformat='${Status}\n' ${pkg} | grep "install ok installed")

    if [ "${is_pkg_installed}" == "install ok installed" ]; then
        echo ${pkg} is installed.
    fi
done

Résultat:

entrez la description de l'image ici

Terry Lin
la source
Bienvenue sur le site et merci pour votre contribution. Cependant, évitez de publier des captures d'écran de la sortie de la console et copiez-le avec un formatage approprié ...
AdminBee
-1
#to check package is installed or not without distribution dependency
#!/bin/bash
read -p "Package Name: " pkg
which $pkg > /dev/null 2>&1
if [ $? == 0 ]
then
echo "$pkg is already installed. "
else
read -p "$pkg is not installed. Answer yes/no if want installation_ " request
if  [ $request == "yes" ]
then
yum install $pkg
fi
fi
linux.cnf
la source
La question n'était pas de vérifier si un seul paquet était déjà installé.
guntbert