Comment savoir si un paquet virtuel est «installé» sur un système Debian?

16

Certains packages ont un en- Provides:tête. Par exemple, le paquet postfixsur Debian Wheezy a Provides: mail-transport-agent.

Le package mail-transport-agentqui n'existe pas physiquement est considéré comme un package "virtuel".

Comment puis-je savoir, sur un système basé sur Debian, si un paquet virtuel donné est "installé" (ou "fourni")? Puis-je répertorier tous les packages virtuels "fournis"?

Astuce : pour répertorier tous les packages virtuels existants, installés ou non, procédez comme suit:aptitude search "~v"

Totor
la source
1
Je n'ai pas de debian pour le moment, mais une installation à sec ne ferait-elle pas l'affaire?
2013

Réponses:

15

Pour répertorier les packages fournissant 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

Faites cela aptitude search '~Pmail-transport-agent ~i'pour ne lister que les packages installés (le cas échéant).

Pour répertorier tous les packages virtuels fournis par les packages actuellement installés:

aptitude search '~Rprovides:~i ~v'

Voir le manuel d'aptitude pour une explication des modèles de recherche.

Gilles 'SO- arrête d'être méchant'
la source
Accepter cette réponse car est utilisé en standard aptitude. J'aime bien l'explication de @ umläute.
Totor
Sur Debian Jessie, je viens d' essayer ce aptitude search '~Pmysql-server ~i'qui donne mariadb-server-10.0et mariadb-server-core-10.0, mais quand je fais aptitude search '~Rprovides:~i ~v', je ne vois pas mysql-serverdans la liste ... Je ne vois cependant virtual-mysql-client, virtual-mysql-client-core, virtual-mysql-serveret virtual-mysql-client-coredans la liste.
Totor
1
@figtrap C'est plus rapide, bien sûr, mais cela ne fonctionne pas .
Gilles 'SO- arrête d'être méchant'
10

le problème ici est qu'il existe une différence subtile entre les packages virtuels et les packages fournis par d'autres packages.

la différence est qu'un package peut également fournir un package réel , pas seulement un package virtuel .

de toute façon, les éléments suivants rechercheront tous les packages qui fournissent un package et imprimeront à la fois le nom du package et les packages qu'il fournit:

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

pour savoir si un paquet est installé sur votre système qui en fournit un (par exemple, mail-transport-agent), utilisez

grep-status -sPackage -sProvides -FProvides "mail-transport-agent"
umläute
la source
3
Remarque: les commandes grep-availableet grep-statussont disponibles une fois que vous avez installé le dctrl-tools package.
Totor
1

Vous pouvez détecter la présence d'un package virtuel donné en utilisant apt-cache showpkg <virtual> pour afficher une liste de packages candidats, puis dpkg -l <canddate> <candidate> ...pour afficher l'état d'installation des candidats.

Par exemple:

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

Voici une impression complète:

$ 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

Je crois dpkget apt-cachesont des outils de niveau inférieur à aptitude, grep-availableet grep-status. L'utilisation d'outils de niveau inférieur peut ou non être un avantage, selon vos besoins particuliers.

mpb
la source
-1

Vous pouvez obtenir tous les packages virtuels de la LISTE AUTORITAIRE DES NOMS DE PAQUETS VIRTUELS . Quant à déterminer si un paquet virtuel est installé j'utilise dpkg -let le fait qu'il a un code de sortie de 0 si le paquet est installé et un code de sortie de 1 s'il n'est pas installé.

dpkg -l mail-transport-agent &> /dev/null; echo $?
StrongBad
la source
Non, ça ne marche pas. dpkg -l mail-transport-agentpeut retourner 0 même s'il n'y a pas de package le fournissant qui est actuellement installé. Je pense que c'est basé sur la présence dans /var/dpkg/lib/availablemais je ne suis pas sûr. J'ai vérifié que dpkg -l foorenvoie 1 pour un package que je n'ai jamais installé mais 0 pour un package que je viens de purger.
Gilles 'SO- arrête d'être méchant'