Identificazione del gestore pacchetti di sistema


12

Esiste un modo (da uno script) per identificare il gestore pacchetti di sistema predefinito?

Per chiarire, quello che voglio fare è eseguire un determinato comando e, su Debian o uno qualsiasi dei suoi derivati, restituirà qualcosa come "apt", su openSUSE restituirà "zypp", su Fedora e altri tornerà "yum", su Arch Linux restituirà "pacman" ecc.

So di poterlo fare con qualcosa di simile al seguente, mi chiedevo solo se esistesse un metodo più robusto che non si rompesse non appena c'è un eseguibile con lo stesso nome.

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

Risposte:


9

Inizia con la risposta accettata a questa domanda: come posso ottenere il nome di distribuzione e il numero di versione in un semplice script shell? . Quindi, decidere quale gestore pacchetti si desidera utilizzare in base alla distribuzione rilevata.


Esiste un elenco prontamente disponibile di gestori di pacchetti per diverse distribuzioni? Ci sono molti cloni debian in particolare.
DrAl,

Non sono sicuro di un elenco facilmente disponibile, ma verranno usati tutti i cloni Debian apt-get.
Jim Paris,

Sì, me ne rendo conto; il mio problema non è tanto quello di identificare la distribuzione (anche se il tuo link lo renderà sicuramente più semplice), ma capire come collegare un nome di distribuzione come (sceglierne uno a caso) "SolusOS" con apt senza mantenere un elenco di ogni distribuzione quello esiste.
DrAl,

Fallo nel modo degli autotools: controlla se funziona. A proposito, che una distribuzione usa apt significa che è un parente Debian (e sono un gruppo piuttosto compatto), trovare yum non significa che le convenzioni di packaging (suddivise in libreria / sviluppo, un grosso mattone di Perl o singoli pacchetti fuori CPAN, ...) sono gli stessi. Non provare nemmeno a installare un pacchetto Fedora su CentOS (ci sono almeno 3 o 4 anni di versione obliqua, semplicemente non funzionerà).
vonbrand il

Rilevare la distro funzionerà solo per quelli popolari. Una whitelist non può essere aggiornata per tutte le distribuzioni meno conosciute. Testare direttamente la presenza degli strumenti è l'unico modo per farlo funzionare. Se sembra un'anatra, nuota come un'anatra e ciondola come un'anatra, allora probabilmente è un'anatra.
liberforce,

8

Invece di identificare i programmi binari, dovresti iniziare da identificare le distribuzioni,

Ti do solo alcune righe che funzionano nello 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

Inoltre, queste parti non possono essere attendibili, ma generalmente le persone non lo faranno.


1

Ho scelto di seguire questa strada dopo aver esaminato gli altri. Questo mi è venuto in mente quando eseguivo molti contenitori docker e avevo bisogno di curl / jq e non potevo fare affidamento su ciò che era disponibile da un lavoro all'altro.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.