How can I know if a virtual package is "installed" on a Debian system?
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.
Related videos on Youtube
Totor
Updated on September 18, 2022Comments
-
Totor over 1 year
Some packages, have a
Provides:
header. For example, the packagepostfix
on Debian Wheezy hasProvides: 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 over 10 yearsI don't have a debian at the moment, but wouldn't a dry-run install do the job?
-
-
Gilles 'SO- stop being evil' over 10 yearsNo, 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 thatdpkg -l foo
returns 1 for a package that I've never installed but 0 for a package that I just purged. -
Totor over 10 yearsAccepting this answer because is uses standard
aptitude
. I like the explaination of @umläute though. -
Totor almost 8 yearsOn Debian Jessie, I just tried
aptitude search '~Pmysql-server ~i'
which givesmariadb-server-10.0
andmariadb-server-core-10.0
, but when I doaptitude search '~Rprovides:~i ~v'
, I do not seemysql-server
in the list... However, I do seevirtual-mysql-client
,virtual-mysql-client-core
,virtual-mysql-server
andvirtual-mysql-client-core
in the list. -
Gilles 'SO- stop being evil' about 6 years@figtrap It's faster, sure, but it doesn't work.
-
gerardw over 3 yearsThat 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 about 2 yearsYour Link id 404.
-
user1133275 about 2 yearsThis does not really work, eg:
grep-available -sPackage -FProvides 'mail-transport-agent'
fails to show anything. -
user1133275 about 2 yearsThat 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' about 2 years@user1133275 I don't know how to do it with
apt-cache
orapt
.