Wie kann ich wissen, ob ein virtuelles Paket auf einem Debian-System "installiert" ist?

16

Einige Pakete haben einen Provides:Header. Zum Beispiel hat das Paket postfixauf Debian Wheezy Provides: mail-transport-agent.

Das Paket, mail-transport-agentdas physikalisch nicht existiert, wird als "virtuelles" Paket betrachtet.

Wie kann ich auf einem Debian-basierten System wissen, ob ein bestimmtes virtuelles Paket "installiert" (oder "bereitgestellt") ist? Kann ich jedes "bereitgestellte" virtuelle Paket auflisten?

Tipp : Um alle vorhandenen virtuellen Pakete aufzulisten, die installiert sind oder nicht, gehen Sie wie folgt vor:aptitude search "~v"

Totor
quelle
1
Ich habe im Moment kein Debian, aber würde eine Trockeninstallation den Job nicht machen?
23.

Antworten:

15

So listen Sie Pakete auf, die Folgendes bereitstellen 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

Führen Sie dies aus, aptitude search '~Pmail-transport-agent ~i'um nur installierte Pakete aufzulisten (falls vorhanden).

So listen Sie alle virtuellen Pakete auf, die von derzeit installierten Paketen bereitgestellt werden:

aptitude search '~Rprovides:~i ~v'

Eine Erklärung der Suchmuster finden Sie im Aptitude-Handbuch .

Gilles 'SO - hör auf böse zu sein'
quelle
Wenn Sie diese Antwort akzeptieren, wird der Standard verwendet aptitude. Die Erklärung von @ umläute gefällt mir allerdings.
Totor
Auf Debian Jessie, habe ich versucht , nur aptitude search '~Pmysql-server ~i'das gibt mariadb-server-10.0und mariadb-server-core-10.0, aber wenn ich das tue aptitude search '~Rprovides:~i ~v', sehe ich nicht mysql-serverin der Liste ... aber ich sehe virtual-mysql-client, virtual-mysql-client-core, virtual-mysql-serverund virtual-mysql-client-corein der Liste.
Totor
1
@figtrap Es ist zwar schneller, aber es funktioniert nicht .
Gilles 'SO- hör auf böse zu sein'
10

Das Problem hierbei ist, dass es einen subtilen Unterschied zwischen virtuellen Paketen und Paketen gibt, die von anderen Paketen bereitgestellt werden.

Der Unterschied besteht darin, dass ein Paket auch ein reales Paket bereitstellen kann , nicht nur ein virtuelles Paket.

Auf jeden Fall sucht das Folgende nach allen Paketen, die ein Paket bereitstellen , und gibt sowohl den Paketnamen als auch die darin enthaltenen Pakete aus:

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

Um herauszufinden, ob auf Ihrem System ein Paket installiert ist, das ein bestimmtes Paket bereitstellt (z. B. Mail-Transport-Agent), verwenden Sie

grep-status -sPackage -sProvides -FProvides "mail-transport-agent"
umläute
quelle
3
Hinweis: Die Befehle grep-availableund grep-statussind verfügbar, sobald Sie das dctrl-tools Paket installiert haben .
Totor
1

Sie können das Vorhandensein eines bestimmten virtuellen Pakets erkennen, indem Sie apt-cache showpkg <virtual>eine Liste der Kandidatenpakete dpkg -l <canddate> <candidate> ...anzeigen und anschließend den Installationsstatus der Kandidaten anzeigen.

Beispielsweise:

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

Hier ist ein vollständiger Ausdruck:

$ 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

Ich glaube dpkgund bin apt-cacheWerkzeuge der niedrigeren Ebene als aptitude, grep-availableund grep-status. Je nach Ihren speziellen Anforderungen kann die Verwendung von Werkzeugen auf niedrigerer Ebene von Vorteil sein oder auch nicht.

mpb
quelle
-1

Sie können alle virtuellen Pakete aus der AUTORITATIVEN LISTE DER VIRTUELLEN PAKETNAMEN abrufen . Um festzustellen, ob ein virtuelles Paket installiert ist, verwende ich dpkg -lund die Tatsache, dass es einen Beendigungscode von 0 hat, wenn das Paket installiert ist, und einen Beendigungscode von 1, wenn es nicht installiert ist.

dpkg -l mail-transport-agent &> /dev/null; echo $?
StrongBad
quelle
Nein, das geht nicht. dpkg -l mail-transport-agentkann 0 zurückgeben, auch wenn kein aktuell installiertes Paket vorhanden ist. Ich denke, es basiert auf der Präsenz in, /var/dpkg/lib/availableaber ich bin mir nicht sicher. Ich habe geprüft, ob dpkg -l foo1 für ein Paket zurückgegeben wird, das ich noch nie installiert habe, aber 0 für ein Paket, das ich gerade gelöscht habe.
Gilles 'SO- hör auf böse zu sein'