Como posso encontrar o número da versão de um pacote instalado via dpkg?

83

Eu uso o dpkg -lcomando para descobrir qual versão de um pacote eu instalei. Por exemplo:

dpkg -l network-manager

retorna as informações no pacote:

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

Como você pode ver, ele retorna o 0.8.3~git.20101118t223039que está errado, porque trunca a versão (eu escolhi uma longa para os fins desta pergunta). A maneira que resolvi isso no passado é passar um argumento COLUMNS estupidamente longo para fazê-lo expandir:

COLUMNS=200 dpkg -l network-manager

o que me dá todo o número da versão, mas também um monte de lixo:

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

Agora eu posso ver o número da versão completa, que é 0.8.3~git.20101118t223039.d60a988-0ubuntu1.

Tenho a sensação de que essa não é a maneira correta de encontrar o número da versão de um pacote instalado. Isso nunca foi realmente um problema no passado, mas com o uso do "ubuntu" nas versões e a proliferação de PPAs, essas seqüências estão ficando cada vez mais longas. Existe uma maneira mais fácil?

Jorge Castro
fonte

Respostas:

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

por exemplo:

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

Saída de amostra:

Version: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
aneeshep
fonte
dpkg --info package.debfunciona, apesar de -snão ter
Twisted Pear
2
@Twisted Pear - dpkg --info package.debopera em arquivos de pacotes, dpkg -s <packagename>opera em nomes de pacotes - nenhum arquivo necessário
pista
37
dpkg-query --showformat='${Version}' --show python3-lxml
AT
fonte
2
Ao consultar vários pacotes, sugiro:dpkg-query --showformat='${Package}\t${Version}\n' --show lsb-release coreutils ...
ThorSummoner
6
Eu gosto desta versão, pois é precisa (não é necessário grep ou cut).
guettli
11
Quase certamente deseja imprimir uma nova linha, caso contrário, esse é o comportamento "printf". Por exemplo dpkg-query --showformat='${Version}\n' --show python3-lxml,.
Chris Lamb
25

Não está usando o dpkgcomando, mas apt-show-versions Instalar banshee

Exemplo:

$ apt-show-versions network-manager  
network-manager/maverick uptodate 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
Isaías
fonte
15

Acho que o aneeshep é a melhor resposta, conforme sua pergunta especifica o uso do dpkg. Mas, por uma questão de integridade, aqui está outra maneira:

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

Ou apenas para o número da versão:

apt-cache policy network-manager | grep 'Installed:' | cut -c 14-
0.8.1+git.20100810t184654.ab580f4-0ubuntu2
andrewsomething
fonte
11
A saída de apt-cachedepende da localidade atual. Por exemplo, na Alemanha, você precisa grep 'Installiert:'. Para compensar isso, sempre use Locale C.UTF-8ao criar scripts. Ou LC_ALL=C.UTF-8; export LC_ALLno início do script ou, caso a caso, algo como:LC_ALL=C.UTF-8 apt-cache policy network-manager | grep 'Installed:' | awk '{print $2}'
Tino
5

Outro método para encontrar a versão de um pacote instalado, dpkgconforme abaixo,

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

Exemplo:

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

Explicação:

dpkg -lO comando lista todos os pacotes instalados. Esta saída padrão foi alimentada como entrada para o awkcomando. awkprocura o nome do pacote correspondente na entrada padrão ( coluna 2 ), se encontrar, então pega a linha correspondente. E, finalmente, imprime o valor de ( coluna 3 ) que realmente representa a versão do pacote.

$ 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

De acordo com o exposto acima, a coluna 2 representa o nome do pacote , a coluna 3 representa a versão do pacote , a coluna 4 representa a arquitetura e a coluna 5 representa a descrição do pacote .

Avinash Raj
fonte
Por que você precisa listar todos os pacotes usando dpkgprimeiro e depois permitir que o awk os filtre novamente? Você pode solicitar a listagem para um único pacote, bem como:dpkg -l <package-name>
gertvdijk