Идентификация системного менеджера пакетов

12

Есть ли способ (из скрипта) идентифицировать системный менеджер пакетов по умолчанию?

Чтобы уточнить, что я хочу сделать, это запустить данную команду, и в Debian или любом из его производных он вернет что-то вроде «apt», в openSUSE он вернет «zypp», в Fedora и др. Он вернет "yum", в Arch Linux он вернет "pacman" и т. д.

Я знаю, что могу сделать это с помощью чего-то вроде следующего, я просто подумал, есть ли более надежный метод, который не сломается, как только появится исполняемый файл с тем же именем.

which apt >/dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "apt"
fi
# etc...
Dral
источник

Ответы:

9

Начните с принятого ответа на этот вопрос: как получить имя дистрибутива и номер версии в простом сценарии оболочки? , Затем решите, какой менеджер пакетов вы хотите использовать, основываясь на обнаруженном дистрибутиве.

Джим Пэрис
источник
Есть ли легко доступный список менеджеров пакетов для разных дистрибутивов? В частности, существует множество клонов Debian.
DrAl
Не уверен насчет легкодоступного списка, но все клоны Debian будут использовать apt-get.
Джим Пэрис
Да, я понимаю это; Моя проблема заключается не столько в идентификации дистрибутива (хотя ваша ссылка, безусловно, облегчит эту задачу), но и в том, чтобы выяснить, как связать имя дистрибутива, например (выбрать случайным образом) «SolusOS» с apt, без ведения списка всех дистрибутивов. это существует.
DrAl
Сделайте это способом autotools: проверьте, работает ли он. Кстати, то, что в дистрибутиве используется apt, означает, что он является родственником Debian (и они довольно компактны), обнаружение yum не означает, что соглашения об упаковке (разделены на библиотеку / разработку, один большой блок Perl или отдельные пакеты отключены). CPAN, ...) одинаковы. Даже не пытайтесь установить пакет Fedora на CentOS (существует не менее 3 или 4 лет перегиба версий, просто не будет работать).
vonbrand
Обнаружение дистрибутива будет работать только для популярных. Белый список не может быть обновлен для всех менее известных дистрибутивов. Непосредственное тестирование наличия инструментов - единственный способ заставить его работать. Если это похоже на утку, плавает как утка и крякает как утка, то это, вероятно, утка.
Либерфорс
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

Этим частям нельзя доверять, но обычно люди этого не делают.

маргаритка
источник
1

Я решил пойти по этому пути после рассмотрения других. Это возникло у меня, когда я запускал много док-контейнеров и нуждался в 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
отметка
источник