# Listar pacotes instalados (Debian) Antes de vermos as várias formas de listar os pacotes instalados no Debian, é preciso observar que, na maioria das vezes, um pacote dependerá da instalação de outros pacotes. Sendo assim, é muito difícil listar apenas aqueles que nós instalamos ativamente usando o `apt`. ### Usando o próprio apt ``` $ apt list --installed ``` Um problema do utilitário `apt` é que ele não oferece uma interface CLI confiável e faz questão de deixar isso claro emitindo o aviso abaixo quando utilizado, por exemplo, em um *pipe*: ``` WARNING: apt does not have a stable CLI interface. Use with caution in scripts. ``` Como essa mensagem é impressa na ***saída padrão de erros*** (`STDERR`), nós podemos omiti-la redirecionando-a para o dispositivo nulo `/dev/null`. Se o redirecionamento: ``` $ apt list --installed | wc -l WARNING: apt does not have a stable CLI interface. Use with caution in scripts. 342 ``` Com o redirecionamento: ``` $ apt list --installed 2> /dev/null | wc -l 342 ``` Outro problema que afeta o uso do `apt list`, principalmente em scripts, é que ele emite a mensagem `Listing...` pela ***saída padrão*** (`STDOUT`): ``` $ apt list --installed 2> /dev/null | head -5 Listing... adduser/unstable,now 3.137 all [installed] apparmor/unstable,now 3.0.12-1+b2 amd64 [installed,automatic] apt-listchanges/unstable,now 3.27 all [installed] apt-utils/unstable,now 2.7.10 amd64 [installed] ``` Isso exige algum tipo de filtragem extra, como: ``` $ apt list --installed 2> /dev/null | grep -v 'Listing...' | head -5 adduser/unstable,now 3.137 all [installed] apparmor/unstable,now 3.0.12-1+b2 amd64 [installed,automatic] apt-listchanges/unstable,now 3.27 all [installed] apt-utils/unstable,now 2.7.10 amd64 [installed] apt/unstable,now 2.7.10 amd64 [installed] ``` ### Usando o utilitário dpkg A opção `-l` do `dpkg` lista os pacotes instalados em uma tabela com várias outras informações: ``` $ dpkg -l ``` Como o `dpkg` possui uma interface CLI confiável, nós podemos filtrar as linhas para obter o resultado desejado. Por exemplo: ``` $ dpkg -l | awk '$2 ~ /^python/ {print $2}' python-apt-common python3 python3-apt python3-certifi python3-chardet python3-charset-normalizer python3-debconf python3-debian python3-debianbts python3-httplib2 python3-idna python3-minimal python3-pkg-resources python3-pycurl python3-pyparsing python3-pysimplesoap python3-reportbug python3-requests python3-six python3-urllib3 python3.11 python3.11-minimal ``` Contudo, o `dpkg` possui uma ferramenta específica para filtrar os dados exibidos nos resultados... ### Usando o utilitário dpkg-query Com o `dpkg-query`, nós podemos escolher quais campos da tabela deverão ser impressos no terminal. Por exemplo, para vermos apenas os nomes dos pacotes: ``` $ dpkg-query -W -f='${Package}\n' | head -5 adduser apparmor apt apt-listchanges apt-utils ``` > **Nota:** o comando é longo e difícil de memorizar, mas pode ser facilmente > utilizado em scripts ou através de "apelidos". ---