Как я могу найти номер версии установленного пакета через 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, чтобы расширить его:

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не сделал
Twisted Pear

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
Мне нравится эта версия, так как она точная (не требуется grep или cut).
Геттли

1
Почти наверняка захочется напечатать новую строку, в противном случае это «printf» -подобное поведение. Например, dpkg-query --showformat='${Version}\n' --show python3-lxml.
Крис Лэмб


15

Я думаю, что aneeshep's - лучший ответ, поскольку ваш вопрос указывает на использование 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}'
Tino

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.