dpkg -s utilisation programmatique avec installation automatique
J'aime dpkg -scar il se termine avec le statut 1si aucun des packages n'est installé, ce qui facilite l'automatisation:
pkgs='qemu-user pandoc'
if ! dpkg -s $pkgs >/dev/null 2>&1; then
sudo apt-get install $pkgs
fi
man dpkg ne documente malheureusement pas le statut de sortie, mais je pense qu'il devrait être raisonnablement sûr de s'y fier:
-s, --status package-name...
Report status of specified package.
Une chose à noter est que l'exécution:
sudo apt remove <package-name>
ne supprime pas nécessairement tous les fichiers immédiatement pour certains packages (mais le fait pour d'autres, vous ne savez pas pourquoi?), et marque simplement le package pour la suppression.
Dans cet état, le package semble être encore utilisable, et comme ses fichiers sont toujours présents, mais il est marqué pour suppression plus tard.
Par exemple, si vous exécutez:
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
puis:
les deux premières echo $?sorties 0, seule la troisième sort1
la sortie du premier dpkg -s certbotcontient:
Status: deinstall ok installed
tandis que le second dit:
Status: deinstall ok config-files
et il ne disparaît qu'après purge:
dpkg-query: package 'certbot' is not installed and no information is available
le fichier /etc/logrotate.d/certbotest toujours présent dans le système après apt remove, mais pas après --purge.
Cependant, le fichier /usr/lib/python3/dist-packages/certbot/reporter.pyest toujours présent même après --purge.
Je ne comprends pas pourquoi, mais avec le hellopackage le deuxième dpkgaprès apt removemontre qu'il a déjà été supprimé sans --purge:
dpkg-query: package 'hello' is not installed and no information is available
Les documentations sont également très peu claires, par exemple:
sudo apt dselect-upgrade
n'a pas supprimé certbotquand il a été marqué comme deinstall, même si cela man apt-getsemble indiquer que:
dselect-upgradeest utilisé en conjonction avec le frontal traditionnel de l’emballage Debian, dselect (1). dselect-upgrade suit les modifications apportées par dselect (1) au champ État des packages disponibles et effectue les actions nécessaires pour réaliser cet état (par exemple, la suppression des anciens et l'installation de nouveaux packages).
Voir également:
Testé sur Ubuntu 19.10.
aptPaquet Python
Il existe un package Python 3 préinstallé appelé aptdans Ubuntu 18.04 qui expose une interface apt Python!
Un script qui vérifie si un package est installé et l'installe sinon peut être vu à: Comment installer un package à l'aide de l'API python-apt
Voici une copie pour référence:
#!/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))
Vérifiez si un exécutable est à la PATHplace
Voir: Comment puis-je vérifier si un programme existe à partir d'un script Bash?