8 votes

Comment vérifier si un paquet virtuel est installé ?

Dans la question suivante, il existe une solution pour vérifier la présence d'un paquet avant de l'installer :

Comment puis-je vérifier si un paquet est installé sur mon serveur ?

Cependant, j'ai constaté que cela ne fonctionne pas pour Paquets virtuels .

Existe-t-il un moyen de parcourir le nom du paquet qu'apt-get sélectionne automatiquement et de vérifier s'il s'agit du bon ?

13voto

Apt n'installera pas un paquet virtuel à moins qu'il n'y ait qu'un seul fournisseur pour celui-ci. Si un autre paquet dépend d'un paquet virtuel, il nomme généralement aussi un paquet réel comme alternative (c'est-à-dire que build-essential dépend de "libc6-dev | libc-dev" - le second étant un paquet virtuel).

Les paquets virtuels ne sont pas installés, vous ne pouvez donc pas vérifier leur état. Vous pouvez utiliser apt-cache showpkg <pkg-name> pour voir quels paquets fournissent le paquet virtuel, puis vérifier si l'un d'entre eux est installé.

6voto

Fabiano Soriani Points 543

Vous pouvez utiliser grep-status (paquet dctrl-tools qui n'est pas installé par défaut) pour trouver tous les paquets installés fournissant un paquet virtuel :

$ grep-status -FProvides,Package -sPackage,Provides,Status awk 
Package: mawk
Provides: awk
Status: install ok installed

Package: gawk
Provides: awk
Status: install ok installed

1voto

La réponse de @FlorianDiesch semble intéressante, mais je veux quelque chose qui ne nécessite aucun logiciel non installé par défaut.

J'ai fini par utiliser ceci :

function check_packages_and_install_if_absent()
{
    for PACKAGENAME
    do
        if
            dpkg -l "$PACKAGENAME" | grep ^ii
        then
            echo "Package $PACKAGENAME is present"
            continue
        fi

        FOUND=""

        while read ACTUALPACKAGENAME
        do
            echo "$PACKAGENAME is a virtual package, that can be provided by $ACTUALPACKAGENAME"

            if
                dpkg -l "$ACTUALPACKAGENAME" | grep ^ii
            then
                echo "Actual package $ACTUALPACKAGENAME is present"
                FOUND=true
                break;
            fi

        done < <( apt-cache showpkg "${PACKAGENAME}" | sed -e '1,/^Reverse Provides: *$/ d' -e 's/ .*$//' | sort | uniq )

        # Using sed to print lines after match
        # https://stackoverflow.com/questions/32569032/sed-print-all-lines-after-match#answer-32569573

        if [[ "$FOUND" == "true" ]]
        then
            continue
        fi

        echo "Package $PACKAGENAME is absent, installing"
        sudo apt-get install -y "$PACKAGENAME"
    done
}

Vous pouvez l'appeler avec une liste de noms de paquets normaux et/ou virtuels :

function check_packages_and_install_if_absent foo bar baz

-3voto

waltinator Points 32821

Vous pouvez interroger la base de données des paquets installés pour nom du paquet avec

dpkg -l packagename   

Et vous pouvez lister tous les fichiers dans nom du paquet avec

dpkg -L packagename

Lire man dpkg pour plus d'informations, notamment sur l'utilisation des caractères génériques.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X