Jak mogę znaleźć numer wersji zainstalowanego pakietu za pomocą dpkg?

83

Używam tego dpkg -lpolecenia, aby dowiedzieć się, którą wersję pakietu zainstalowałem. Na przykład:

dpkg -l network-manager

zwraca informacje na opakowaniu:

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

Jak widać, zwraca wartość, 0.8.3~git.20101118t223039która jest błędna, ponieważ obcina wersję (wybrałem długą na potrzeby tego pytania). Sposób, w jaki rozwiązałem to w przeszłości, polega na przekazaniu głupio długiego argumentu COLUMNS, aby go rozwinąć:

COLUMNS=200 dpkg -l network-manager

co daje mi cały numer wersji, ale także garść śmieci:

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

Teraz widzę pełny numer wersji, który jest 0.8.3~git.20101118t223039.d60a988-0ubuntu1.

Mam wrażenie, że nie jest to właściwy sposób na znalezienie numeru wersji zainstalowanego pakietu. W przeszłości tak naprawdę nigdy nie stanowiło to problemu, ale przy dołączaniu „ubuntu” w wersjach i rozprzestrzenianiu się umów PPA ciągi te stają się coraz dłuższe. Czy istnieje prostszy sposób?

Jorge Castro
źródło

Odpowiedzi:

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

na przykład:

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

Przykładowe dane wyjściowe:

Version: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
aneeshep
źródło
dpkg --info package.debdziała, choć -snie
Twisted Pear
2
@Twisted Pear - dpkg --info package.debdziała na plikach pakietów, dpkg -s <packagename>działa na nazwach pakietów - plik nie jest wymagany
linia
37
dpkg-query --showformat='${Version}' --show python3-lxml
W
źródło
2
Przy wyszukiwaniu wielu pakietów sugeruję:dpkg-query --showformat='${Package}\t${Version}\n' --show lsb-release coreutils ...
ThorSummoner
6
Podoba mi się ta wersja, ponieważ jest precyzyjna (nie wymaga grep ani cięcia).
guettli
1
Niemal na pewno chcę wydrukować nowy wiersz, w przeciwnym razie jest to zachowanie podobne do „printf”. Na przykład dpkg-query --showformat='${Version}\n' --show python3-lxml.
Chris Lamb
25

To nie używa dpkgpolecenia, ale apt-show-wersje Zainstaluj banshee

Przykład:

$ apt-show-versions network-manager  
network-manager/maverick uptodate 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
Izajasza
źródło
15

Myślę, że aneeshep's jest najlepszą odpowiedzią, ponieważ twoje pytanie określa użycie dpkg. Ale dla kompletności, oto inny sposób:

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

Lub tylko numer wersji:

apt-cache policy network-manager | grep 'Installed:' | cut -c 14-
0.8.1+git.20100810t184654.ab580f4-0ubuntu2
andrews coś
źródło
1
Dane wyjściowe apt-cachezależą od bieżących ustawień regionalnych. Na przykład w Niemczech musisz grep 'Installiert:'. Aby to zrekompensować, zawsze używaj ustawień regionalnych C.UTF-8podczas pisania skryptów. Albo LC_ALL=C.UTF-8; export LC_ALLna początku skryptu, albo dla poszczególnych przypadków coś takiego:LC_ALL=C.UTF-8 apt-cache policy network-manager | grep 'Installed:' | awk '{print $2}'
Tino
5

Inną metodą znalezienia wersji zainstalowanego pakietu jest dpkgjak poniżej:

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

Przykład:

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

Wyjaśnienie:

dpkg -lpolecenie wyświetla listę wszystkich zainstalowanych pakietów. To standardowe wyjście zostało podane jako dane wejściowe do awkpolecenia. awkszuka odpowiedniej nazwy pakietu na standardowym wejściu ( kolumna 2 ), jeśli znajdzie, to pobiera odpowiedni wiersz. I w końcu wypisuje wartość ( kolumna 3 ), która faktycznie reprezentuje wersję pakietu.

$ 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

Zgodnie z powyższym kolumna 2 reprezentuje nazwę pakietu , kolumna 3 reprezentuje wersję pakietu , kolumna 4 reprezentuje architekturę, a kolumna 5 przedstawia opis pakietu .

Avinash Raj
źródło
Dlaczego najpierw musisz wyświetlić listę wszystkich pakietów, dpkga następnie pozwolić, aby awk je ponownie przefiltrował? Możesz poprosić o wpis także dla pojedynczej paczki:dpkg -l <package-name>
gertvdijk