Визначення менеджера системного пакету


12

Чи існує спосіб (із сценарію) визначити менеджера системних пакетів за замовчуванням?

Щоб уточнити, що я хочу зробити, це запустити задану команду, і на Debian або будь-яких її похідних вона поверне щось на зразок "apt", на openSUSE поверне "zypp", на Fedora та ін повернеться "ням", на Arch Linux він поверне "pacman" і т.д.

Я знаю, що я можу це зробити з чимось на зразок наступного, я просто задумався, чи існує більш надійний метод, який не зламається, як тільки з'явиться виконаний файл з тим же ім’ям.

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

Відповіді:


9

Почніть з прийнятої відповіді на це питання: Як я можу отримати ім'я розповсюдження та номер версії у простому скрипті оболонки? . Потім визначте, який менеджер пакунків ви хочете використовувати на основі виявленої дистрибуції.


Чи є доступний список менеджерів пакетів для різних дистрибутивів? Зокрема, дуже багато клонів Debian.
ДрАл

Не впевнений у доступному списку, але використовуватимуться всі клони Debian apt-get.
Джим Париж

Так, я усвідомлюю це; моя проблема - не стільки ідентифікація дистрибутива (хоча ваше посилання, безумовно, полегшить це), це з'ясування того, як пов’язати ім'я дистрибутива на зразок (вибрати навмання) "SolusOS" з apt, не підтримуючи список кожного дистрибутива що існує.
DrAl

Зробіть це автоінструментом: Перевірте, чи працює він. BTW, що дистрибуція використовує apt, означає, що це родич Debian (а вони - досить компактна купа), а пошук yum не означає, що конвенції про упаковку (розбиті на бібліотеку / розробку, один великий цегла Perl або окремі пакети відключені) CPAN, ...) однакові. Навіть не намагайтеся встановити пакет Fedora на CentOS (є принаймні 3 або 4 роки перекосу версії, просто не вийде).
фонбранд

Визначення дистрибутива буде працювати лише для популярних. Білий список не може бути оновлений для всіх менш відомих дистрибутивів. Безпосередньо перевірка наявності інструментів - єдиний спосіб змусити його працювати. Якщо вона схожа на качку, плаває, як качка, і квакає, як качка, то, ймовірно, це качка.
liberforce

8

Замість того, щоб ідентифікувати бінарні програми, слід почати з ідентифікаційних дистрибутивів,

Просто дайте вам кілька рядків, які працюють у сценаріїх 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

Завдяки цим частинам не можна довіряти, але люди зазвичай цього не роблять.


2

Я вирішив пройти цей маршрут після перегляду інших. Це з’явилося для мене, коли я працював з багатьма контейнерами для докера та потребував curl / jq і не міг покладатися на те, що було доступно від роботи до роботи.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.