How can I know if a virtual package is "installed" on a Debian system?

6,994

Solution 1

To list packages providing 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

Make that aptitude search '~Pmail-transport-agent ~i' to only list installed packages (if any).

To list all virtual packages provided by currently installed packages:

aptitude search '~Rprovides:~i ~v'

See the aptitude manual for an explanation of the search patterns.

Solution 2

the problem here is that there is a subtle difference between virtual packages and packages provided by other packages.

the difference is, that a package may provide a real package as well, not only a virtual package.

anyhow, the following will search for all packages that provide a package and will print both the package name and the packages it provides:

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

to find whether any package is installed on your system that provides a given one (e.g. mail-transport-agent), use

grep-status -sPackage -sProvides -FProvides "mail-transport-agent"

Solution 3

You can detect the presence of a given virtual package by using apt-cache showpkg <virtual> to display a list of candidate packages, and then dpkg -l <canddate> <candidate> ... to display the installation status of the candidates.

For example:

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

Here is a full printout:

$ 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

I believe dpkg and apt-cache are lower level tools than aptitude, grep-available and grep-status. Using lower level tools may or may not be a benefit, depending upon your particular requirements.

Share:
6,994

Related videos on Youtube

Totor
Author by

Totor

Updated on September 18, 2022

Comments

  • Totor
    Totor over 1 year

    Some packages, have a Provides: header. For example, the package postfix on Debian Wheezy has Provides: mail-transport-agent.

    The package mail-transport-agent which doesn't exist physically is considered as a "virtual" package.

    How can I know, on a Debian based system, if a given virtual package is "installed" (or "provided")? Can I list every "provided" virtual package?

    Hint: to list every existing virtual package, installed or not, do: aptitude search "~v"

    • Admin
      Admin over 10 years
      I don't have a debian at the moment, but wouldn't a dry-run install do the job?
  • Gilles 'SO- stop being evil'
    Gilles 'SO- stop being evil' over 10 years
    No, this doesn't work. dpkg -l mail-transport-agent can return 0 even if there is no package providing it that is currently installed. I think it's based on presence in /var/dpkg/lib/available but I'm not sure. I did check that dpkg -l foo returns 1 for a package that I've never installed but 0 for a package that I just purged.
  • Totor
    Totor over 10 years
    Accepting this answer because is uses standard aptitude. I like the explaination of @umläute though.
  • Totor
    Totor almost 8 years
    On Debian Jessie, I just tried aptitude search '~Pmysql-server ~i' which gives mariadb-server-10.0 and mariadb-server-core-10.0, but when I do aptitude search '~Rprovides:~i ~v', I do not see mysql-server in the list... However, I do see virtual-mysql-client, virtual-mysql-client-core, virtual-mysql-server and virtual-mysql-client-core in the list.
  • Gilles 'SO- stop being evil'
    Gilles 'SO- stop being evil' about 6 years
    @figtrap It's faster, sure, but it doesn't work.
  • gerardw
    gerardw over 3 years
    That did not work for me in the case a virtual package has replaced a real package. apt-cache search package listed the real and virtual package provider.
  • user1133275
    user1133275 about 2 years
    Your Link id 404.
  • user1133275
    user1133275 about 2 years
    This does not really work, eg: grep-available -sPackage -FProvides 'mail-transport-agent' fails to show anything.
  • user1133275
    user1133275 about 2 years
    That is so useful, do you know how to do this on other package managers? (BTW your link is now 404)
  • Gilles 'SO- stop being evil'
    Gilles 'SO- stop being evil' about 2 years
    @user1133275 I don't know how to do it with apt-cache or apt.