dpkg -s
utilizzo programmatico con installazione automatica
Mi piace dpkg -s
in quanto esce con stato 1
se uno dei pacchetti non è installato, rendendo semplice l'automazione:
pkgs='qemu-user pandoc'
if ! dpkg -s $pkgs >/dev/null 2>&1; then
sudo apt-get install $pkgs
fi
man dpkg
purtroppo non documenta lo stato di uscita, ma penso che dovrebbe essere ragionevolmente sicuro fare affidamento su di esso:
-s, --status package-name...
Report status of specified package.
Una cosa da notare è che in esecuzione:
sudo apt remove <package-name>
non rimuove necessariamente immediatamente tutti i file per alcuni pacchetti (ma lo fa per altri, non sai perché?) e contrassegna semplicemente il pacchetto per la rimozione.
In questo stato, il pacchetto sembra essere ancora utilizzabile e poiché i suoi file sono ancora presenti, ma è contrassegnato per la rimozione in seguito.
Ad esempio se esegui:
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
poi:
le prime due echo $?
uscite 0
, solo la terza uscita1
l'output per il primo dpkg -s certbot
contiene:
Status: deinstall ok installed
mentre il secondo dice:
Status: deinstall ok config-files
e scompare solo dopo l'eliminazione:
dpkg-query: package 'certbot' is not installed and no information is available
il file /etc/logrotate.d/certbot
è ancora presente nel sistema dopo apt remove
, ma non dopo --purge
.
Tuttavia, il file /usr/lib/python3/dist-packages/certbot/reporter.py
è ancora presente anche dopo --purge
.
Non capisco perché, ma con il hello
pacchetto il secondo dpkg
dopo apt remove
mostra che il pacchetto è già stato rimosso senza --purge
:
dpkg-query: package 'hello' is not installed and no information is available
Le documentazioni sono anche poco chiare, ad esempio:
sudo apt dselect-upgrade
non è stato rimosso certbot
quando è stato contrassegnato come deinstall
, anche se man apt-get
sembra indicare che:
dselect-upgrade
è usato insieme al tradizionale front-end di packaging Debian, dselect (1). dselect-upgrade segue le modifiche apportate da dselect (1) al campo Stato dei pacchetti disponibili ed esegue le azioni necessarie per realizzare quello stato (ad esempio, la rimozione di vecchi e l'installazione di nuovi pacchetti).
Guarda anche:
Testato su Ubuntu 19.10.
apt
Pacchetto Python
Esiste un pacchetto Python 3 preinstallato chiamato apt
in Ubuntu 18.04 che espone un'interfaccia apt Python!
Uno script che controlla se un pacchetto è installato e lo installa se non è visibile in: Come installare un pacchetto usando l'API python-apt
Ecco una copia per riferimento:
#!/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))
Controllare se un eseguibile è PATH
invece
Vedi: Come posso verificare se esiste un programma da uno script Bash?