Controlla se tutti i pacchetti elencati sono installati in bash


9

Il mio binario dipende da queste librerie boost e dai rispettivi pacchetti:

NAME                                  |          PACKAGE:
--------------------------------------+-----------------------------------
libboost_serialization.so.1.55.0      |  libboost-serialization1.55.0
libboost_thread.so.1.55.0             |  ibboost-thread1.55.0
libboost_date_time.so.1.55.0          |  libboost-date-time1.55.0
libboost_signals.so.1.55.0            |  libboost-signals1.55.0

Quindi vorrei definire un elenco di pacchetti:

boostlibnames="libboost-serialization1.55.0 libboost-thread1.55.0 libboost-date-time1.55.0 libboost-signals1.55.0"

E ora vorrei verificare se sono tutti installati e solo allora eseguiranno effettivamente apt-get install. So che apt verificherà automaticamente se i pacchetti sono già installati, ma mi piacerebbe inserire in un messaggio all'utente se desidera installare le librerie mancanti prima di farlo.

Quindi c'è un buon modo per verificare se tutte le librerie elencate (nella variabile come sopra) sono installate?


Crea un pacchetto Debian adeguato e lascia che apt gestisca le dipendenze
ivanivan,

@ivanivan È un'applicazione aziendale interna e ovviamente non open-source.
Tomáš Zato - Ripristina Monica il

Non significa che devi distribuire il file deb o qualcos'altro oltre la tua azienda interna ... basta usare la risoluzione delle dipendenze dei sistemi di packaging. Diamine, usa il metodo su questo q / a per creare un pacchetto falso per installare i deps - unix.stackexchange.com/questions/318117/…
ivanivan

Risposte:


13

Il dpkg -scomando restituisce lo stato dei pacchetti installati. Ad esempio, sul mio sistema, se lo eseguo per il firefoxquale è installato e neditche non lo è, ottengo:

$ dpkg -s firefox
Package: firefox
Status: install ok installed
Priority: optional
Section: web
Installed-Size: 94341
Maintainer: Clement Lefebvre <root@linuxmint.com>
Architecture: amd64
Version: 41.0~linuxmint1+betsy
Replaces: firefox-l10n-af, firefox-l10n-ar, firefox-l10n-be, firefox-l10n-bg, firefox-l10n-bn-bd, firefox-l10n-ca, firefox-l10n-cs, firefox-l10n-da, firefox-l10n-de, firefox-l10n-el, firefox-l10n-en-gb, firefox-l10n-en-us, firefox-l10n-eo, firefox-l10n-es, firefox-l10n-et, firefox-l10n-eu, firefox-l10n-fa, firefox-l10n-fi, firefox-l10n-fr, firefox-l10n-fy, firefox-l10n-gl, firefox-l10n-gu, firefox-l10n-he, firefox-l10n-hi, firefox-l10n-hr, firefox-l10n-hu, firefox-l10n-id, firefox-l10n-is, firefox-l10n-it, firefox-l10n-ja, firefox-l10n-kn, firefox-l10n-ko, firefox-l10n-lt, firefox-l10n-lv, firefox-l10n-nb, firefox-l10n-nl, firefox-l10n-nn, firefox-l10n-pl, firefox-l10n-pt, firefox-l10n-pt-br, firefox-l10n-ro, firefox-l10n-ru, firefox-l10n-sk, firefox-l10n-sl, firefox-l10n-sq, firefox-l10n-sr, firefox-l10n-sv, firefox-l10n-th, firefox-l10n-tr, firefox-l10n-uk, firefox-l10n-zh
Provides: gnome-www-browser, www-browser
Breaks: firefox-l10n-en-us
Description: The Firefox web browser
 The Mozilla Firefox Web Browser.

$ dpkg -s nedit
dpkg-query: package 'nedit' is not installed and no information is available
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.

Quindi, puoi usare quel comando per verificare se un pacchetto è installato:

#!/usr/bin/env bash

run_install()
{
    ## Prompt the user 
    read -p "Do you want to install missing libraries? [Y/n]: " answer
    ## Set the default value if no answer was given
    answer=${answer:Y}
    ## If the answer matches y or Y, install
    [[ $answer =~ [Yy] ]] && apt-get install ${boostlibnames[@]}
}

boostlibnames=("libboost-serialization1.55.0" "libboost-thread1.55.0"
                "libboost-date-time1.55.0" "libboost-signals1.55.0" "nedit")
## Run the run_install function if sany of the libraries are missing
dpkg -s "${boostlibnames[@]}" >/dev/null 2>&1 || run_install

C'è un modo breve per salvare i risultati? Per esempio. in C / C ++ lo farei installed = installed || isInstalled(libArray[i]). Allo stesso modo, vorrei inserire false in una variabile se uno o più non fossero installati. Penso di poterlo fare con if, ma è un sacco di codice per niente.
Tomáš Zato - Ripristina Monica il

@ TomášZato sì, ma dovrai essere più specifico. Vuoi salvare l'elenco delle librerie mancanti? Ne basta uno? Personalmente, vorrei solo verificare se tutti sono installati e se almeno uno non lo è, eseguirli apt-get installsu tutti. Tutti quelli installati verranno semplicemente ignorati. Fammi sapere cosa vuoi e lo modificherò. In sostanza, è necessario cambiare il || echo ...verso || installed=1o qualcosa del genere.
terdon

Volevo fare esattamente quello che fai, è uno sforzo sprecato per salvare l'elenco delle librerie mancanti. Basta controllare tutto e, se manca, richiedere all'utente apt-get. Ho già fatto funzionare il tuo codice con una brutta ifdichiarazione, ma la variabile sarebbe preferibile. Ho intenzione di avvolgerlo in una funzione.
Tomáš Zato - Ripristina Monica il

@ TomášZato OK, dai un'occhiata alla risposta aggiornata. L'ho semplificato un po 'poiché dpkg -sposso controllare più pacchetti contemporaneamente.
terdon

1

Oggi ho svolto questa funzione per un sistema CentOS.

#!/bin/bash

# List of the packages that should be present
list=("vim-enhanced" "nano" "expect" "dialog" "epel-release" "yum-utils" "bind-utils")

# Check for the existence of the packages in the system and print to file.txt the packages to be installed
check_list=$(rpm -q "${list[@]}" | grep -e "not installed" | awk 'BEGIN { FS = " " } ; { print $2}' > list.txt)

# Check if the list.txt is empty
grep -q '[^[:space:]]' < list.txt
EMPTY_FILE=$?
# If list.txt is empty there's nothing to do
if [[ $EMPTY_FILE -eq 1 ]]; then

echo "Nothing to do"

else

# If list.txt is not empty it installs the packages in list.txt

for PACKAGES in `cat /your/path/list.txt`; do

  yum install -y $PACKAGES

done

fi

Bene, ho leggermente modificato la funzione. Più veloce e non ha più bisogno di un loop.

#!/bin/bash


list=("vim-enhanced" "nano" "expect" "dialog" "epel-release" "yum-utils" "bind-utils")
check_list=$(rpm -q "${list[@]}" | grep -e "not installed" | awk 'BEGIN { FS = " " } ; { printf $2" "}' > /your/path/to/list.txt)
install=$(cat /your/path/to/list.txt)

grep -q '[^[:space:]]' < /your/path/to/list.txt

EMPTY_FILE=$?

if [[ $EMPTY_FILE -eq 1 ]]; then

echo "Nothing to do"

else

yum install -y $install

fi

La controparte Debian / Ubuntu:

apt -qq YOUR_LIST_GOES_HERE | grep -v "installed" | awk -F/ '{print $1}' > /your/path/to/list.txt
packages=$(cat /your/path/to/list.txt)
grep -q '[^[:space:]]' < /your/path/to/list.txt
EMPTY_FILE=$?
if [[ $EMPTY_FILE -eq 1 ]]; then
echo "Nothing to do"
else
apt-get  install -y $packages
fi

0

Quanto segue ti fornirà un elenco di tutti i pacchetti rilevanti che non sono installati:

dpkg -l $boostlibnames 2>&1 | awk '{if (/^D|^\||^\+/) {next} else if(/^dpkg-query:/) { print $6} else if(!/^[hi]i/) {print $2}}' 

Questo salta dpkg -lle righe di intestazione e quindi stampa le righe in cui dpkg-query si lamenta di un pacchetto sconosciuto e le linee che non iniziano con hio ii(Hold Inst o Install Inst).

Di solito, farei qualcosa del genere awk 'NR<=5 {next} ; ...'o mi sed -e '1,5d'sbarazzerei delle dpkg -lrighe di intestazione, ma in questo caso stiamo reindirizzando stderr a stdout per catturare i reclami dpkg-queryoltre dpkg -lall'output, quindi non possiamo semplicemente eliminare il primo 5 righe.

Questo mostrerà i pacchetti che non sono mai stati installati, rimossi, eliminati o dove l'installazione non è riuscita / parzialmente completata a causa di un errore.


0

Uso il seguente codice nel mio lavoro chiamato Easy Bash , che aiuta a installare rapidamente i pacchetti più popolari sui server Ubuntu. Questo codice controllerà i pacchetti elencati installati o meno.

#!/usr/bin/env bash

packages=("curl" "gnupg2" "ca-certificates" "lsb-release")

for pkg in ${packages[@]}; do

    is_pkg_installed=$(dpkg-query -W --showformat='${Status}\n' ${pkg} | grep "install ok installed")

    if [ "${is_pkg_installed}" == "install ok installed" ]; then
        echo ${pkg} is installed.
    fi
done

Risultato:

inserisci qui la descrizione dell'immagine


Benvenuto nel sito e grazie per il tuo contributo. Ancora, si prega di evitare pubblicazione di screenshot per l'output su console , e copia-e-Pase che con una corretta formattazione invece ...
AdminBee

-1
#to check package is installed or not without distribution dependency
#!/bin/bash
read -p "Package Name: " pkg
which $pkg > /dev/null 2>&1
if [ $? == 0 ]
then
echo "$pkg is already installed. "
else
read -p "$pkg is not installed. Answer yes/no if want installation_ " request
if  [ $request == "yes" ]
then
yum install $pkg
fi
fi

La domanda non riguardava la verifica se un singolo pacchetto è già installato.
Guntbert,
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.