Überprüfen Sie, ob alle aufgelisteten Pakete in bash installiert sind

9

Meine Binärdatei hängt von diesen Boost-Bibliotheken und den entsprechenden Paketen ab:

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

Daher möchte ich eine Liste von Paketen definieren:

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

Und jetzt möchte ich überprüfen, ob sie alle installiert sind und erst dann tatsächlich ausgeführt werden apt-get install. Ich weiß, dass apt automatisch prüft, ob die Pakete bereits installiert sind, aber ich möchte dem Benutzer in einer Eingabeaufforderung mitteilen, ob er fehlende Bibliotheken installieren möchte, bevor er dies tut.

Gibt es also eine gute Möglichkeit zu überprüfen, ob alle aufgelisteten Bibliotheken (in Variablen wie oben) installiert sind?

Tomáš Zato - Monica wieder einsetzen
quelle
Erstellen Sie ein richtiges Debian-Paket und lassen Sie apt die Abhängigkeiten behandeln
ivanivan
@ivanivan Es ist eine interne Unternehmensanwendung und natürlich nicht Open Source.
Tomáš Zato - Wiedereinsetzung Monica
Das bedeutet nicht, dass Sie die Deb-Datei oder etwas anderes außerhalb Ihres internen Unternehmens verteilen müssen. Verwenden Sie einfach die Auflösung der Abhängigkeit von Verpackungssystemen. Verwenden Sie die Methode in diesem Q / A, um ein gefälschtes Paket zu erstellen und die Deps zu installieren - unix.stackexchange.com/questions/318117/…
ivanivan

Antworten:

13

Der dpkg -sBefehl gibt den Status der installierten Pakete zurück. Wenn ich es beispielsweise auf meinem System ausführe, für firefoxdas installiert ist und für neditdas nicht, wird Folgendes angezeigt:

$ 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.

Mit diesem Befehl können Sie also überprüfen, ob ein Paket installiert ist:

#!/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
terdon
quelle
Gibt es eine kurze Möglichkeit, Ergebnisse zu speichern? Z.B. in C / C ++ würde ich tun installed = installed || isInstalled(libArray[i]). In ähnlicher Weise möchte ich false in eine Variable einfügen, wenn eine oder mehrere nicht installiert sind. Ich denke, ich kann das damit machen if, aber das ist viel Code für nichts.
Tomáš Zato - Wiedereinsetzung Monica
@ TomášZato ja, aber du musst genauer sein. Möchten Sie die Liste der fehlenden Bibliotheken speichern? Ist nur einer genug? Persönlich würde ich nur prüfen, ob alle installiert sind, und wenn mindestens einer nicht installiert ist, apt-get installauf allen ausführen . Alle installierten werden einfach ignoriert. Lassen Sie mich wissen, was Sie wollen und ich werde dies bearbeiten. Grundsätzlich müssen Sie die Änderungen || echo ...an || installed=1oder so etwas.
Terdon
Ich wollte genau das tun, was Sie tun. Es ist vergeblich, die Liste der fehlenden Bibliotheken zu speichern. Überprüfen Sie einfach alle, und wenn einer fehlt, fordern Sie den Benutzer zur Eingabe von apt-get auf. Ich habe Ihren Code bereits mit hässlichen ifAnweisungen arbeiten lassen, aber Variable würde bevorzugt. Ich habe vor, es in eine Funktion zu packen.
Tomáš Zato - Wiedereinsetzung Monica
@ TomášZato OK, schauen Sie sich die aktualisierte Antwort an. Ich habe es ein wenig vereinfacht, da ich dpkg -snach mehreren Paketen gleichzeitig suchen kann.
Terdon
1

Ich habe diese Funktion heute für ein CentOS-System ausgeführt.

#!/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

Nun, ich habe die Funktion leicht modifiziert. Schneller und es braucht keine Schleife mehr.

#!/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

Das Debian / Ubuntu-Gegenstück:

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
Claudio Taccogna
quelle
0

Im Folgenden finden Sie eine Liste aller relevanten Pakete, die nicht installiert sind:

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

Dies überspringt dpkg -ldie Kopfzeilen und druckt dann Zeilen aus, in denen sich dpkg-query über ein unbekanntes Paket beschwert, UND Zeilen, die nicht mit hioder beginnen ii(Hold Inst oder Install Inst).

Normalerweise würde ich so etwas wie awk 'NR<=5 {next} ; ...'oder sed -e '1,5d'um die dpkg -lKopfzeilen loszuwerden , aber in diesem Fall leiten wir stderr nach stdout um, um Beschwerden dpkg-querysowie dpkg -ldie Ausgabe abzufangen, sodass wir die erste nicht einfach löschen können 5 Zeilen.

Dies zeigt Pakete an, die entweder nie installiert, entfernt oder gelöscht wurden oder bei denen die Installation aufgrund eines Fehlers fehlgeschlagen oder teilweise abgeschlossen ist.

cas
quelle
0

Ich verwende in meiner Arbeit den folgenden Code namens Easy Bash , mit dessen Hilfe die beliebtesten Pakete schnell auf Ubuntu-Servern installiert werden können. Dieser Code überprüft die aufgelisteten installierten Pakete oder nicht.

#!/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

Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Terry Lin
quelle
Willkommen auf der Website und vielen Dank für Ihren Beitrag. Vermeiden Sie es dennoch, Screenshots der Konsolenausgabe zu veröffentlichen , und kopieren Sie sie stattdessen mit der richtigen Formatierung ...
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
linux.cnf
quelle
Bei der Frage ging es nicht darum zu überprüfen, ob bereits ein einzelnes Paket installiert ist.
Guntbert