Como posso saber se um pacote virtual está "instalado" em um sistema Debian?

16

Alguns pacotes têm um Provides:cabeçalho. Por exemplo, o pacote postfixno Debian Wheezy possui Provides: mail-transport-agent.

O pacote mail-transport-agentque não existe fisicamente é considerado como um pacote "virtual".

Como posso saber, em um sistema baseado no Debian, se um determinado pacote virtual está "instalado" (ou "fornecido")? Posso listar todos os pacotes virtuais "fornecidos"?

Dica : para listar todos os pacotes virtuais existentes, instalados ou não, faça:aptitude search "~v"

Totor
fonte
11
Eu não tenho um debian no momento, mas uma instalação a seco não funcionaria?
jthill

Respostas:

15

Para listar pacotes fornecendo mail-transport-agent:

$ aptitude search '~Pmail-transport-agent'
p   citadel-mta                     - complete and feature-rich groupware server
p   courier-mta                     - Courier mail server - ESMTP daemon        
p   dma                             - lightweight mail transport agent          
p   esmtp-run                       - user configurable relay-only MTA - the reg
p   exim4-daemon-heavy              - Exim MTA (v4) daemon with extended feature
p   exim4-daemon-light              - lightweight Exim MTA (v4) daemon          
p   masqmail                        - mail transport agent for intermittently co
p   msmtp-mta                       - light SMTP client with support for server 
p   nullmailer                      - simple relay-only mail transport agent    
i   postfix                         - High-performance mail transport agent     
p   sendmail-bin                    - powerful, efficient, and scalable Mail Tra
p   ssmtp                           - extremely simple MTA to get mail off the s
p   xmail                           - advanced, fast and reliable ESMTP/POP3 mai

Faça isso aptitude search '~Pmail-transport-agent ~i'para listar apenas os pacotes instalados (se houver).

Para listar todos os pacotes virtuais fornecidos pelos pacotes atualmente instalados:

aptitude search '~Rprovides:~i ~v'

Veja o manual do aptitude para uma explicação dos padrões de busca.

Gilles 'SO- parar de ser mau'
fonte
Aceitando esta resposta porque é usa padrão aptitude. Eu gosto da explicação de @ umläute embora.
Totor
No Debian Jessie, eu apenas tentei aptitude search '~Pmysql-server ~i'que dá mariadb-server-10.0e mariadb-server-core-10.0, mas quando eu faço aptitude search '~Rprovides:~i ~v', eu não vejo mysql-serverna lista ... No entanto, eu vejo virtual-mysql-client, virtual-mysql-client-core, virtual-mysql-servere virtual-mysql-client-corena lista.
Totor
11
@figtrap É mais rápido, claro, mas não funciona .
Gilles 'SO- stop be evil'
10

o problema aqui é que há uma diferença sutil entre pacotes virtuais e pacotes fornecidos por outros pacotes.

a diferença é que um pacote também pode fornecer um pacote real , não apenas um pacote virtual .

de qualquer maneira, o seguinte pesquisará todos os pacotes que fornecem um pacote e imprimirá o nome do pacote e os pacotes que ele fornece:

grep-available -sPackage  -sProvides -FProvides -e '^.'

para descobrir se algum pacote está instalado no seu sistema que fornece um determinado (por exemplo, mail-transport-agent), use

grep-status -sPackage -sProvides -FProvides "mail-transport-agent"
umläute
fonte
3
Nota: os comandos grep-availablee grep-statusestão disponíveis após a instalação do dctrl-tools pacote.
Totor 17/10
1

Você pode detectar a presença de um determinado pacote virtual, usando apt-cache showpkg <virtual>para exibir uma lista de pacotes de candidatos, e, em seguida, dpkg -l <canddate> <candidate> ...para exibir o status dos candidatos instalação.

Por exemplo:

$ apt-cache showpkg awk
$ dpkg -l original-awk mawk gawk

Aqui está uma impressão completa:

$ apt-cache showpkg awk
Package: awk
Versions: 

Reverse Depends: 
  base-files,awk
  base-files,awk
Dependencies: 
Provides: 
Reverse Provides: 
mawk:i386 1.3.3-17ubuntu2
gawk:i386 1:4.0.1+dfsg-2.1ubuntu2
original-awk 2012-12-20-1
mawk 1.3.3-17ubuntu2
gawk 1:4.0.1+dfsg-2.1ubuntu2

$ dpkg -l original-awk mawk gawk
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  gawk           1:4.0.1+dfsg amd64        GNU awk, a pattern scanning and p
ii  mawk           1.3.3-17ubun amd64        a pattern scanning and text proce
dpkg-query: no packages found matching original-awk

Acredito dpkge apt-cachesou uma ferramenta de nível inferior a aptitude, grep-availablee grep-status. O uso de ferramentas de nível inferior pode ou não ser um benefício, dependendo de seus requisitos específicos.

mpb
fonte
-1

Você pode obter todos os pacotes virtuais na LISTA AUTORITATIVA DE NOMES DE PACOTES VIRTUAIS . Para determinar se um pacote virtual está instalado, eu uso dpkg -le o fato de ter um código de saída 0 se o pacote estiver instalado e um código de saída 1 se não estiver instalado.

dpkg -l mail-transport-agent &> /dev/null; echo $?
StrongBad
fonte
Não, isso não funciona. dpkg -l mail-transport-agentpode retornar 0, mesmo se não houver um pacote, desde que esteja instalado atualmente. Eu acho que é baseado na presença, /var/dpkg/lib/availablemas não tenho certeza. Eu verifiquei que dpkg -l fooretorna 1 para um pacote que eu nunca instalei, mas 0 para um pacote que acabei de limpar.
Gilles 'SO- stop be evil'