dpkg -s uso programático con instalación automática
Me gusta dpkg -sya que sale con estado 1si 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 certbotcontiene:
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/certbottodaví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.pytodavía está presente incluso después --purge.
No entiendo por qué, pero con el hellopaquete el segundo dpkgdespués apt removemuestra 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ó certbotcuando se marcó como deinstall, aunque man apt-getparece indicar que:
dselect-upgradese 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 aptPaquete
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 PATHlugar
Ver: ¿Cómo puedo verificar si un programa existe desde un script Bash?