Як я можу знайти номер версії встановленого пакету через dpkg?


83

Я використовую dpkg -lкоманду, щоб дізнатися, яку версію пакета я встановив. Наприклад:

dpkg -l network-manager

повертає інформацію про пакет:

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

Як бачите, він повертається, 0.8.3~git.20101118t223039що неправильно, оскільки він скорочує версію (я вибрав довгу для цілей цього питання). Я вирішував це в минулому, це передати дурно довгий аргумент КОЛОНН, щоб він розширився:

COLUMNS=200 dpkg -l network-manager

що дає мені весь номер версії, а також купу мотлоху:

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

Тепер я бачу повний номер версії, який є 0.8.3~git.20101118t223039.d60a988-0ubuntu1.

Я відчуваю, що це не правильний спосіб знайти номер версії встановленого пакету. Це ніколи насправді не було проблемою в минулому, але із застосуванням "ubuntu" у версіях та розповсюдженням PPA ці рядки стають все довшими та довшими. Чи є простіший спосіб?

Відповіді:


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

наприклад:

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

Вибірка зразка:

Version: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2

dpkg --info package.debпрацює, хоча -sй не
Скручена груша

2
@Twisted Pear - dpkg --info package.debпрацює над файлами пакетів, dpkg -s <packagename>працює над іменами пакунків - не потрібно файлу
провулок

37
dpkg-query --showformat='${Version}' --show python3-lxml

2
Запитуючи кілька пакетів, я пропоную:dpkg-query --showformat='${Package}\t${Version}\n' --show lsb-release coreutils ...
ThorSummoner

6
Мені подобається ця версія, оскільки вона є акуратною (не потрібна ні грепка, ні обрізання).
guettli

1
Майже напевно хочеться надрукувати новий рядок, інакше це поведінка, що нагадує "printf". Наприклад, dpkg-query --showformat='${Version}\n' --show python3-lxml.
Кріс Ламб

25

Це не використання dpkgкоманди, а apt-show-версій Встановіть banshee

Приклад:

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

15

Я думаю, що aneeshep - найкраща відповідь, оскільки ваше питання визначає використання dpkg. Але задля повноти, ось ще один спосіб:

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

Або лише для номера версії:

apt-cache policy network-manager | grep 'Installed:' | cut -c 14-
0.8.1+git.20100810t184654.ab580f4-0ubuntu2

1
Вихід apt-cacheзалежить від поточного локального рівня. Наприклад, у Німеччині потрібно grep 'Installiert:'. Щоб компенсувати це, завжди використовуйте програму Locale C.UTF-8під час написання сценарію. Або LC_ALL=C.UTF-8; export LC_ALLна початку сценарію, або для кожного конкретного випадку щось на зразок:LC_ALL=C.UTF-8 apt-cache policy network-manager | grep 'Installed:' | awk '{print $2}'
Тіно

5

Ще один спосіб знайти версію встановленого пакету за допомогою dpkgнаведеної нижче,

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

Приклад:

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

Пояснення:

dpkg -lКоманда перелічує всі встановлені пакети. Цей стандартний вихід подається як вхід до awkкоманди. awkшукає відповідну назву пакета у стандартному вході ( стовпець 2 ), якщо він знаходить, то він захоплює відповідний рядок. І, нарешті, друкується значення ( стовпець 3 ), яке фактично являє собою версію пакета.

$ 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

Згідно з вищесказаним, стовпець 2 представляє назву пакета , стовпець 3 представляє версію пакета , стовпець 4 представляє архітектуру, а стовпець 5 представляє опис пакета .


Чому потрібно перелічити всі пакунки, використовуючи dpkgспочатку, а потім дозволити awk фільтрувати їх ще раз? Ви також можете подати запит на перелік для одного пакету:dpkg -l <package-name>
gertvdijk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.