dpkg -s programmatische Nutzung mit automatischer Installation
Ich mag dpkg -ses, 1wenn es mit dem Status beendet wird, wenn eines der Pakete nicht installiert ist, was die Automatisierung vereinfacht:
pkgs='qemu-user pandoc'
if ! dpkg -s $pkgs >/dev/null 2>&1; then
sudo apt-get install $pkgs
fi
man dpkg dokumentiert den Exit-Status leider nicht, aber ich denke, es sollte einigermaßen sicher sein, sich darauf zu verlassen:
-s, --status package-name...
Report status of specified package.
Eine Sache zu beachten ist, dass Laufen:
sudo apt remove <package-name>
entfernt nicht unbedingt alle Dateien sofort für einige Pakete (aber für andere, nicht sicher warum?) und markiert nur das Paket zum Entfernen.
In diesem Zustand scheint das Paket weiterhin verwendbar zu sein und da seine Dateien noch vorhanden sind, wird es jedoch zum späteren Entfernen markiert.
Zum Beispiel, wenn Sie ausführen:
pkg=certbot
sudo apt install -y "$pkg"
dpkg -s "$pkg"
echo $?
sudo apt remove -y "$pkg"
dpkg -s "$pkg"
echo $?
ls -l /usr/lib/python3/dist-packages/certbot/reporter.py
sudo apt remove --purge certbot
dpkg -s "$pkg"
echo $?
ls -l /usr/lib/python3/dist-packages/certbot/reporter.py
dann:
die ersten beiden echo $?geben aus 0, nur die dritte gibt aus1
Die Ausgabe für die erste dpkg -s certbotenthält:
Status: deinstall ok installed
während der zweite sagt:
Status: deinstall ok config-files
und es verschwindet erst nach der Säuberung:
dpkg-query: package 'certbot' is not installed and no information is available
Die Datei /etc/logrotate.d/certbotist nach apt remove, aber nicht nach dem System noch vorhanden --purge.
Die Datei /usr/lib/python3/dist-packages/certbot/reporter.pyist jedoch auch danach noch vorhanden --purge.
Ich verstehe nicht warum, aber mit dem helloPaket zeigt das zweite dpkgnach apt remove, dass das Paket bereits entfernt wurde ohne --purge:
dpkg-query: package 'hello' is not installed and no information is available
Die Dokumentationen sind auch sehr unklar, zB:
sudo apt dselect-upgrade
wurde nicht entfernt, certbotals es als markiert wurde deinstall, obwohl dies man apt-getdarauf hinzudeuten scheint:
dselect-upgradewird in Verbindung mit dem traditionellen Debian-Verpackungs-Frontend dselect (1) verwendet. dselect-upgrade folgt den Änderungen, die dselect (1) im Feld Status der verfügbaren Pakete vorgenommen hat, und führt die zur Realisierung dieses Status erforderlichen Aktionen aus (z. B. Entfernen alter und Installation neuer Pakete).
Siehe auch:
Getestet unter Ubuntu 19.10.
Python- aptPaket
aptIn Ubuntu 18.04 gibt es ein vorinstalliertes Python 3-Paket , das eine Python-Apt-Oberfläche verfügbar macht!
Ein Skript, das prüft, ob ein Paket installiert ist, und es installiert, wenn nicht, finden Sie unter: So installieren Sie ein Paket mithilfe der Python-Apt-API
Hier ist eine Kopie als Referenz:
#!/usr/bin/env python
# aptinstall.py
import apt
import sys
pkg_name = "libjs-yui-doc"
cache = apt.cache.Cache()
cache.update()
cache.open()
pkg = cache[pkg_name]
if pkg.is_installed:
print "{pkg_name} already installed".format(pkg_name=pkg_name)
else:
pkg.mark_install()
try:
cache.commit()
except Exception, arg:
print >> sys.stderr, "Sorry, package installation failed [{err}]".format(err=str(arg))
Überprüfen Sie PATHstattdessen, ob eine ausführbare Datei vorhanden ist
Siehe: Wie kann ich anhand eines Bash-Skripts überprüfen, ob ein Programm vorhanden ist?