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?


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

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

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.


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


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

La question n'était pas de vérifier si un seul paquet était déjà installé.
— guntbert
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.