我如何知道在Debian系统上是否“安装”了虚拟软件包?


16

有些包有一个Provides:标题。例如,postfixDebian Wheezy上的软件包具有Provides: mail-transport-agent

mail-transport-agent物理上不存在的程序包被视为“虚拟”程序包。

在基于Debian的系统上,我如何知道某个给定的虚拟软件包是否已“安装”(或“提供”)?我可以列出每个“提供的”虚拟软件包吗?

提示:列出所有已安装或未安装的现有虚拟软件包,请执行以下操作:aptitude search "~v"


1
我目前没有debian,但是试运行安装不会做吗?
jthill 2013年

Answers:


15

列出提供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

使之aptitude search '~Pmail-transport-agent ~i'仅列出已安装的软件包(如果有)。

要列出当前安装的软件包提供的所有虚拟软件包:

aptitude search '~Rprovides:~i ~v'

有关搜索模式的说明,请参见aptitude手册


接受此答案是因为使用标准aptitude。我喜欢@umläute的解释。
Totor

在Debian杰西,我只是想aptitude search '~Pmysql-server ~i'这给mariadb-server-10.0mariadb-server-core-10.0,但是当我做aptitude search '~Rprovides:~i ~v',我没有看到mysql-server在列表中。不过,我确实看到virtual-mysql-clientvirtual-mysql-client-corevirtual-mysql-servervirtual-mysql-client-core在列表中。
Totor


10

这里的问题是虚拟软件包与其他软件包提供的软件包之间存在细微的差别。

不同的是,一个包可以提供一个真正的包以及,不仅是一个虚拟包。

无论如何,以下内容将搜索提供软件包的所有软件包,并打印软件包名称和它提供的软件包:

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

查找系统上是否安装了提供给定软件包的任何软件包(例如mail-transport-agent),请使用

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

3
注意:命令grep-availablegrep-status在安装dctrl-tools 软件包后可用。
Totor

1

您可以通过apt-cache showpkg <virtual>显示候选软件包的列表,然后dpkg -l <canddate> <candidate> ...显示候选软件包的安装状态,来检测给定虚拟软件包的存在。

例如:

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

这是完整的打印输出:

$ 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

我相信dpkgapt-cache较低水平的工具比aptitudegrep-availablegrep-status。根据您的特定要求,使用较低级别的工具可能不会有所好处。


-1

您可以从虚拟软件包名称权威列表中获取所有虚拟软件包。至于确定是否安装了虚拟软件包,我使用dpkg -l以下事实:如果安装了虚拟软件包,则退出代码为0,如果未安装虚拟软件包,则退出代码为1。

dpkg -l mail-transport-agent &> /dev/null; echo $?

不,这不起作用。dpkg -l mail-transport-agent即使没有提供当前安装的软件包,也可以返回0。我认为这是基于在场情况,/var/dpkg/lib/available但我不确定。我确实检查过,dpkg -l foo对于从未安装过的软件包,返回1,对于刚刚清除的软件包,返回0。
吉尔斯(Gillles)“所以-别再邪恶了”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.