Wie finde ich die Versionsnummer eines installierten Pakets über dpkg?

83

Ich benutze den dpkg -lBefehl, um herauszufinden, welche Version eines Pakets ich installiert habe. Zum Beispiel:

dpkg -l network-manager

gibt die Informationen auf dem Paket zurück:

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                   Description
+++-=========================-=========================-==================================================================
ii  network-manager           0.8.3~git.20101118t223039 network management framework daemon

Wie Sie sehen, wird das Ergebnis 0.8.3~git.20101118t223039falsch wiedergegeben, da die Version abgeschnitten wurde (für diese Frage habe ich eine lange ausgewählt). Die Art und Weise, wie ich das in der Vergangenheit gelöst habe, besteht darin, ein dummes langes COLUMNS-Argument zu übergeben, um es zu erweitern:

COLUMNS=200 dpkg -l network-manager

Das gibt mir die gesamte Versionsnummer, aber auch eine Menge Müll:

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                                      Description
+++-============================================-============================================-========================================================================================================
ii  network-manager                              0.8.3~git.20101118t223039.d60a988-0ubuntu1   network management framework daemon

Jetzt kann ich die vollständige Versionsnummer sehen, die ist 0.8.3~git.20101118t223039.d60a988-0ubuntu1.

Ich habe das Gefühl, dass dies nicht der richtige Weg ist, um die Versionsnummer eines installierten Pakets zu ermitteln. Dies war in der Vergangenheit nie wirklich ein Problem, aber mit dem Anheften von "Ubuntu" in den Versionen und der Verbreitung von PPAs werden diese Saiten immer länger. Gibt es einen einfacheren Weg?

Jorge Castro
quelle

Antworten:

82
dpkg -s <packagename> | grep '^Version:'

z.B:

dpkg -s network-manager | grep '^Version:'

Beispielausgabe:

Version: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
aneeshep
quelle
dpkg --info package.debfunktioniert, -saber nicht
Twisted Pear
2
@ Twisted Pear - dpkg --info package.debarbeitet mit Paketdateien, dpkg -s <packagename>arbeitet mit Paketnamen - keine Datei erforderlich
Lane
37
dpkg-query --showformat='${Version}' --show python3-lxml
BEIM
quelle
2
Bei der Abfrage mehrerer Pakete schlage ich vor:dpkg-query --showformat='${Package}\t${Version}\n' --show lsb-release coreutils ...
ThorSummoner 30.12.15
6
Ich mag diese Version, da sie präzise ist (kein Grep oder Cut nötig).
Guettli
1
Mit ziemlicher Sicherheit möchten Sie eine neue Zeile drucken, da dies sonst ein "printf" -ähnliches Verhalten ist. Zum Beispiel dpkg-query --showformat='${Version}\n' --show python3-lxml.
Chris Lamb
25

Es benutzt nicht den dpkgBefehl, sondern apt-show-versions Installieren Sie Banshee

Beispiel:

$ apt-show-versions network-manager  
network-manager/maverick uptodate 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
Jesaja
quelle
15

Ich denke, Aneesheps ist die beste Antwort, da Ihre Frage die Verwendung von dpkg spezifiziert. Der Vollständigkeit halber ist hier ein anderer Weg:

apt-cache policy network-manager 
network-manager:
  Installed: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
  Candidate: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
  Version table:
 *** 0.8.1+git.20100810t184654.ab580f4-0ubuntu2 0
        500 http://us.archive.ubuntu.com/ubuntu/ maverick/main i386 Packages
        100 /var/lib/dpkg/status

Oder nur für die Versionsnummer:

apt-cache policy network-manager | grep 'Installed:' | cut -c 14-
0.8.1+git.20100810t184654.ab580f4-0ubuntu2
undetwas
quelle
1
Die Ausgabe von apt-cachehängt vom aktuellen Gebietsschema ab. Zum Beispiel in Deutschland muss man grep 'Installiert:'. Um dies auszugleichen, verwenden Sie C.UTF-8beim Erstellen von Skripten immer das Gebietsschema . Entweder mit LC_ALL=C.UTF-8; export LC_ALLzu Beginn des Skripts oder von Fall zu Fall etwas wie:LC_ALL=C.UTF-8 apt-cache policy network-manager | grep 'Installed:' | awk '{print $2}'
Tino
5

Eine andere Methode, um die Version eines installierten Pakets dpkgwie folgt zu finden:

dpkg -l | awk '$2=="package-name" { print $3 }'  

Beispiel:

$ dpkg -l | awk '$2=="network-manager" { print $3 }'
0.9.8.0-0ubuntu22

Erläuterung:

dpkg -lBefehl listet alle installierten Pakete auf. Diese Standardausgabe wurde als Eingabe in den awkBefehl eingespeist . awkSucht nach dem entsprechenden Paketnamen in der Standardeingabe ( Spalte 2 ), wenn es gefunden wird, dann greift es nach der entsprechenden Zeile. Und schließlich wird der Wert von ( Spalte 3 ) ausgegeben, der tatsächlich die Paketversion darstellt.

$ dpkg -l
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

Entsprechend dem Obigen repräsentiert Spalte 2 den Paketnamen , Spalte 3 repräsentiert die Paketversion , Spalte 4 repräsentiert die Architektur und Spalte 5 repräsentiert die Paketbeschreibung .

Avinash Raj
quelle
Warum müssen Sie zuerst alle Pakete mit dpkgauflisten und awk sie dann erneut filtern lassen? Sie können die Auflistung auch für ein einzelnes Paket dpkg -l <package-name>
anfordern