Identificando o Gerenciador de Pacotes do Sistema

12

Existe uma maneira (de um script) para identificar o gerenciador de pacotes do sistema padrão?

Para esclarecer, o que eu quero fazer é executar um comando e, no Debian ou em qualquer um de seus derivados, ele retornará algo como "apt", no openSUSE ele retornará "zypp", no Fedora et al. "yum", no Arch Linux ele retornará "pacman" etc.

Eu sei que posso fazer isso com algo como o seguinte, apenas me perguntei se havia um método mais robusto que não quebrasse assim que houvesse um executável com o mesmo nome.

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

Respostas:

9

Comece com a resposta aceita para esta pergunta: Como obter o nome da distribuição e o número da versão em um simples shell script? . Em seguida, decida qual gerenciador de pacotes você deseja usar com base na distribuição detectada.

Jim Paris
fonte
Existe uma lista prontamente disponível de gerenciadores de pacotes para diferentes distribuições? Existem muitos clones do debian em particular.
DrAl
Não tenho certeza sobre uma lista prontamente disponível, mas todos os clones do Debian usarão apt-get.
Jim Paris
Sim, eu percebo isso; meu problema não é tanto identificar a distribuição (embora seu link certamente torne isso mais fácil), está tentando descobrir como vincular um nome de distribuição como (para escolher um aleatoriamente) "SolusOS" com o apt sem manter uma lista de todas as distribuições isso existe.
DrAl
Faça da maneira autotools: verifique se funciona. BTW, que uma distribuição usa o apt significa que é um parente do Debian (e eles são um grupo bastante compacto), encontrar yum não significa que as convenções de empacotamento (divididas em biblioteca / desenvolvimento, um grande bloco de Perl ou pacotes individuais CPAN, ...) são os mesmos. Nem tente instalar um pacote Fedora no CentOS (há pelo menos 3 ou 4 anos de distorção de versão, simplesmente não funcionará).
vonbrand
Detectar a distribuição só funcionará para as populares. Uma lista de permissões não pode ser atualizada para distribuições menos conhecidas. Testar diretamente a presença das ferramentas é a única maneira de fazê-lo funcionar. Se parece um pato, nada como um pato e grasna como um pato, provavelmente é um pato.
liberforce
8

Em vez de identificar programas binários, você deve começar por identificar distribuições,

Dê apenas algumas linhas que funcionam no script 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

Em todas essas partes não se pode confiar, mas geralmente as pessoas não fazem isso.

margarida
fonte
1

Optei por seguir esse caminho depois de revisar os outros. Isso surgiu para mim ao executar muitos contêineres de docker e precisar de curl / jq e não poder confiar no que estava disponível de um trabalho para outro.

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
Marca
fonte