dpkg -s
uso programático con instalación automática
Me gusta dpkg -s
ya que sale con estado 1
si alguno de los paquetes no está instalado, lo que facilita la automatización:
pkgs='qemu-user pandoc'
if ! dpkg -s $pkgs >/dev/null 2>&1; then
sudo apt-get install $pkgs
fi
man dpkg
lamentablemente no documenta el estado de salida, pero creo que debería ser razonablemente seguro confiar en él:
-s, --status package-name...
Report status of specified package.
Una cosa a tener en cuenta es que se ejecuta:
sudo apt remove <package-name>
no necesariamente elimina todos los archivos de inmediato para algunos paquetes (pero lo hace para otros, ¿no está seguro de por qué?), y solo marca el paquete para su eliminación.
En este estado, el paquete parece seguir siendo utilizable, y como sus archivos todavía están presentes, pero está marcado para su eliminación más adelante.
Por ejemplo, si ejecuta:
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
luego:
los dos primeros echo $?
resultados0
, solo la tercera salida1
la salida para el primero dpkg -s certbot
contiene:
Status: deinstall ok installed
mientras que el segundo dice:
Status: deinstall ok config-files
y solo desaparece después de la purga:
dpkg-query: package 'certbot' is not installed and no information is available
el archivo /etc/logrotate.d/certbot
todavía está presente en el sistema después deapt remove
, pero no después --purge
.
Sin embargo, el archivo /usr/lib/python3/dist-packages/certbot/reporter.py
todavía está presente incluso después --purge
.
No entiendo por qué, pero con el hello
paquete el segundo dpkg
después apt remove
muestra que el paquete ya se ha eliminado sin --purge
:
dpkg-query: package 'hello' is not installed and no information is available
Las documentaciones también son muy poco claras, por ejemplo:
sudo apt dselect-upgrade
no se eliminó certbot
cuando se marcó como deinstall
, aunque man apt-get
parece indicar que:
dselect-upgrade
se usa en conjunto con el front-end de empaquetado tradicional de Debian, dselect (1). dselect-upgrade sigue los cambios realizados por dselect (1) en el campo Estado de los paquetes disponibles y realiza las acciones necesarias para realizar ese estado (por ejemplo, la eliminación de paquetes antiguos y la instalación de paquetes nuevos).
Ver también:
Probado en Ubuntu 19.10.
Pitón apt
Paquete
Hay un paquete de Python 3 preinstalado llamado apt
en Ubuntu 18.04 que expone una interfaz de Python apt!
Un script que verifica si un paquete está instalado y lo instala si no se puede ver en: Cómo instalar un paquete usando la API python-apt
Aquí hay una copia para referencia:
#!/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))
Compruebe si hay un ejecutable en su PATH
lugar
Ver: ¿Cómo puedo verificar si un programa existe desde un script Bash?