Identification du gestionnaire de packages système

12

Existe-t-il un moyen (à partir d'un script) d'identifier le gestionnaire de packages système par défaut?

Pour clarifier, ce que je veux faire est d'exécuter une commande donnée et, sur Debian ou l'un de ses dérivés, il retournera quelque chose comme "apt", sur openSUSE, il retournera "zypp", sur Fedora et al, il retournera "miam", sur Arch Linux ça retournera "pacman" etc.

Je sais que je peux le faire avec quelque chose comme ce qui suit, je me demandais simplement s'il y avait une méthode plus robuste qui ne se briserait pas dès qu'il y aurait un exécutable du même nom.

which apt >/dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "apt"
fi
# etc...
DrAl
la source

Réponses:

9

Commencez par la réponse acceptée à cette question: comment puis-je obtenir le nom de la distribution et le numéro de version dans un simple script shell? . Ensuite, décidez quel gestionnaire de packages vous souhaitez utiliser en fonction de la distribution détectée.

Jim Paris
la source
Existe-t-il une liste facilement disponible de gestionnaires de packages pour différentes distributions? Il y a beaucoup de clones Debian en particulier.
DrAl
Pas sûr d'une liste facilement disponible, mais tous les clones Debian utiliseront apt-get.
Jim Paris
Oui, je m'en rends compte; mon problème n'est pas tellement d'identifier la distribution (bien que votre lien le rende certainement plus facile), il s'agit de savoir comment lier un nom de distribution comme (pour en choisir un au hasard) "SolusOS" avec apt sans maintenir une liste de chaque distribution qui existe.
DrAl
Faites-le de la manière des outils automatiques: vérifiez si cela fonctionne. BTW, qu'une distribution utilise apt signifie qu'il s'agit d'un parent Debian (et ils sont un groupe plutôt compact), trouver miam ne signifie pas que les conventions de packaging (divisées en bibliothèque / développement, une grosse brique de Perl ou des packages individuels désactivés CPAN, ...) sont les mêmes. N'essayez même pas d'installer un paquet Fedora sur CentOS (il y a au moins 3 ou 4 ans de biais de version, ça ne marchera pas).
vonbrand
La détection de la distribution ne fonctionnera que pour les plus populaires. Une liste blanche ne peut pas être mise à jour pour toutes les distributions les moins connues. Tester directement la présence des outils est le seul moyen de le faire fonctionner. S'il ressemble à un canard, nage comme un canard et quacks comme un canard, alors c'est probablement un canard.
liberforce
8

Au lieu d'identifier les programmes binaires, vous devez commencer par identifier les distributions,

Donnez-vous simplement quelques lignes qui fonctionnent dans les scripts bash:

declare -A osInfo;
osInfo[/etc/redhat-release]=yum
osInfo[/etc/arch-release]=pacman
osInfo[/etc/gentoo-release]=emerge
osInfo[/etc/SuSE-release]=zypp
osInfo[/etc/debian_version]=apt-get

for f in ${!osInfo[@]}
do
    if [[ -f $f ]];then
        echo Package manager: ${osInfo[$f]}
    fi
done

Bien que ces pièces ne soient pas fiables, mais généralement les gens ne le feront pas.

Marguerite
la source
1

J'ai choisi de suivre cette voie après avoir examiné les autres. Cela m'est venu lors de l'exécution de nombreux conteneurs Docker et nécessitant curl / jq et ne pouvant pas compter sur ce qui était disponible d'un travail à l'autre.

script:
 - if [ -x "$(command -v apk)" ]; then apk add --no-cache curl jq; fi
 - if [ -x "$(command -v apt-get)" ]; then apt-get install curl jq; fi
 - if [ -x "$(command -v dnf)" ]; then dnf install curl jq; fi
 - if [ -x "$(command -v zypper)" ]; then zypper install curl jq; fi
marque
la source