dpkg -s
uso programático com instalação automática
Gosto dpkg -s
que ele saia com status 1
se algum dos pacotes não estiver instalado, facilitando a automação:
pkgs='qemu-user pandoc'
if ! dpkg -s $pkgs >/dev/null 2>&1; then
sudo apt-get install $pkgs
fi
man dpkg
infelizmente não documenta o status de saída, mas acho que deve ser razoavelmente seguro confiar nele:
-s, --status package-name...
Report status of specified package.
Uma coisa a notar é que executando:
sudo apt remove <package-name>
não remove necessariamente todos os arquivos imediatamente para alguns pacotes (mas remove outros, não sabe por quê?) e apenas marca o pacote para remoção.
Nesse estado, o pacote parece ainda ser utilizável e como seus arquivos ainda estão presentes, mas é marcado para remoção posteriormente.
Por exemplo, se você executar:
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
então:
as duas primeiras echo $?
saídas 0
, apenas a terceira produz1
a saída para o primeiro dpkg -s certbot
contém:
Status: deinstall ok installed
enquanto o segundo diz:
Status: deinstall ok config-files
e só desaparece após a limpeza:
dpkg-query: package 'certbot' is not installed and no information is available
o arquivo /etc/logrotate.d/certbot
ainda está presente no sistema depois apt remove
, mas não depois --purge
.
No entanto, o arquivo /usr/lib/python3/dist-packages/certbot/reporter.py
ainda está presente mesmo depois --purge
.
Eu não entendo o porquê, mas com o hello
pacote o segundo dpkg
depois apt remove
mostra que ele já foi removido sem --purge
:
dpkg-query: package 'hello' is not installed and no information is available
As documentações também não são claras, por exemplo:
sudo apt dselect-upgrade
não removeu certbot
quando foi marcado como deinstall
, embora man apt-get
pareça indicar que:
dselect-upgrade
é usado em conjunto com o front-end tradicional de empacotamento Debian, dselect (1). O dselect-upgrade segue as alterações feitas pelo dselect (1) no campo Status dos pacotes disponíveis e executa as ações necessárias para realizar esse estado (por exemplo, a remoção de antigos e a instalação de novos pacotes).
Veja também:
Testado no Ubuntu 19.10.
apt
Pacote Python
Existe um pacote Python 3 pré-instalado chamado apt
Ubuntu 18.04 que expõe uma interface apt do Python!
Um script que verifica se um pacote está instalado e o instala se não puder pode ser visto em: Como instalar um pacote usando a API python-apt
Aqui está uma cópia para referência:
#!/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))
Verifique se um executável está no PATH
lugar
Consulte: Como posso verificar se existe um programa a partir de um script Bash?