¿Cómo puedo saber si un paquete virtual está "instalado" en un sistema Debian?

16

Algunos paquetes tienen un Provides:encabezado. Por ejemplo, el paquete postfixen Debian Wheezy tiene Provides: mail-transport-agent.

El paquete mail-transport-agentque no existe físicamente se considera un paquete "virtual".

¿Cómo puedo saber, en un sistema basado en Debian, si un paquete virtual dado está "instalado" (o "proporcionado")? ¿Puedo enumerar cada paquete virtual "provisto"?

Sugerencia : para enumerar cada paquete virtual existente, instalado o no, haga lo siguiente:aptitude search "~v"

Totor
fuente
1
No tengo un Debian en este momento, pero ¿no funcionaría una instalación en seco?
jthill

Respuestas:

15

Para enumerar los paquetes que proporcionan 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

Haga que aptitude search '~Pmail-transport-agent ~i'solo enumere los paquetes instalados (si los hay).

Para enumerar todos los paquetes virtuales proporcionados por los paquetes instalados actualmente:

aptitude search '~Rprovides:~i ~v'

Consulte el manual de aptitud para obtener una explicación de los patrones de búsqueda.

Gilles 'SO- deja de ser malvado'
fuente
Aceptando esta respuesta porque es utiliza estándar aptitude. Sin embargo, me gusta la explicación de @ umläute.
Totor
En Debian Jessie, he intentado aptitude search '~Pmysql-server ~i'que da mariadb-server-10.0y mariadb-server-core-10.0, pero cuando lo hago aptitude search '~Rprovides:~i ~v', no lo veo mysql-serveren la lista ... Sin embargo, yo veo virtual-mysql-client, virtual-mysql-client-core, virtual-mysql-servery virtual-mysql-client-coreen la lista.
Totor
1
@figtrap Es más rápido, claro, pero no funciona .
Gilles 'SO- deja de ser malvado'
10

El problema aquí es que existe una sutil diferencia entre los paquetes virtuales y los paquetes proporcionados por otros paquetes.

la diferencia es que un paquete también puede proporcionar un paquete real , no solo un paquete virtual .

de todos modos, lo siguiente buscará todos los paquetes que proporcionan un paquete e imprimirá tanto el nombre del paquete como los paquetes que proporciona:

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

para saber si hay algún paquete instalado en su sistema que proporcione uno determinado (por ejemplo, mail-transport-agent), use

grep-status -sPackage -sProvides -FProvides "mail-transport-agent"
umläute
fuente
3
Nota: los comandos grep-availabley grep-statusestán disponibles una vez que instaló el dctrl-tools paquete.
Totor
1

Puede detectar la presencia de un paquete virtual dado usando apt-cache showpkg <virtual>para mostrar una lista de paquetes candidatos y luego dpkg -l <canddate> <candidate> ...para mostrar el estado de instalación de los candidatos.

Por ejemplo:

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

Aquí hay una impresión 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

Creo dpkgy apt-cacheson herramientas de nivel inferior que aptitude, grep-availabley grep-status. El uso de herramientas de nivel inferior puede o no ser un beneficio, dependiendo de sus requisitos particulares.

mpb
fuente
-1

Puede obtener todos los paquetes virtuales de la LISTA AUTORITATIVA DE NOMBRES DE PAQUETES VIRTUALES . En cuanto a determinar si un paquete virtual está instalado, lo uso dpkg -ly el hecho de que tiene un código de salida de 0 si el paquete está instalado y un código de salida de 1 si no está instalado.

dpkg -l mail-transport-agent &> /dev/null; echo $?
Fuerte
fuente
No, esto no funciona. dpkg -l mail-transport-agentpuede devolver 0 incluso si no hay un paquete que lo proporcione actualmente instalado. Creo que se basa en la presencia, /var/dpkg/lib/availablepero no estoy seguro. Verifiqué que dpkg -l foodevuelve 1 para un paquete que nunca he instalado pero 0 para un paquete que acabo de purgar.
Gilles 'SO- deja de ser malvado'