Identyfikacja menedżera pakietów systemowych

12

Czy istnieje sposób (ze skryptu) zidentyfikowania domyślnego menedżera pakietów systemowych?

Aby wyjaśnić, chcę uruchomić dane polecenie, a na Debianie lub dowolnej jego pochodnej zwróci coś w rodzaju „apt”, na openSUSE zwróci „zypp”, na Fedorze i innych zwróci „mniam”, w Arch Linux zwróci „pacman” itp.

Wiem, że mogę to zrobić w następujący sposób, po prostu zastanawiałem się, czy istnieje bardziej niezawodna metoda, która nie ulegnie awarii, gdy tylko pojawi się plik wykonywalny o tej samej nazwie.

which apt >/dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "apt"
fi
# etc...
DrAl
źródło

Odpowiedzi:

9

Zacznij od zaakceptowanej odpowiedzi na to pytanie: Jak uzyskać nazwę dystrybucji i numer wersji w prostym skrypcie powłoki? . Następnie zdecyduj, którego menedżera pakietów chcesz użyć na podstawie wykrytej dystrybucji.

Jim Paris
źródło
Czy istnieje łatwo dostępna lista menedżerów pakietów dla różnych dystrybucji? W szczególności jest wiele klonów Debiana.
DrAl
Nie jestem pewien co do łatwo dostępnej listy, ale wszystkie klony Debiana będą korzystać apt-get.
Jim Paris,
Tak, zdaję sobie z tego sprawę; mój problem nie tyle identyfikuje dystrybucję (chociaż twój link na pewno to ułatwi), ale zastanawia się, jak połączyć nazwę dystrybucji, taką jak (losowo wybrać) „SolusOS” z apt, bez utrzymywania listy każdej dystrybucji to istnieje.
DrAl
Zrób to automatycznie: sprawdź, czy działa. BTW, że dystrybucja używa apt oznacza, że ​​jest krewnym Debiana (i są raczej zwartą grupą), znalezienie yum nie oznacza, że ​​konwencje pakowania (podzielone na bibliotekę / rozwój, jedną wielką cegłę Perla lub pojedyncze pakiety wyłączone) CPAN, ...) są takie same. Nawet nie próbuj instalować pakietu Fedory na CentOS (istnieją co najmniej 3 lub 4 lata wersji skośnej, po prostu nie będzie działać).
vonbrand,
Wykrywanie dystrybucji będzie działać tylko w przypadku popularnych. Nie można zaktualizować białej listy dla mniej znanych dystrybucji. Jedynym sposobem, aby działało, jest bezpośrednie testowanie obecności narzędzi. Jeśli wygląda jak kaczka, pływa jak kaczka i kwacze jak kaczka, to prawdopodobnie jest to kaczka.
liberforce
8

Zamiast identyfikować programy binarne, powinieneś zacząć od identyfikacji dystrybucji,

Wystarczy podać kilka wierszy, które działają w skryptach 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

Przez te części nie można ufać, ale generalnie ludzie tego nie zrobią.

stokrotka
źródło
2

Zdecydowałem się pójść tą drogą po przejrzeniu pozostałych. To przyszło mi do głowy, gdy uruchomiłem wiele kontenerów dokerów i potrzebowałem curl / jq i nie mogłem polegać na tym, co było dostępne od zadania do zadania.

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
znak
źródło