如何从debian/changelog中提取软件包版本?

什么是解析源代码包的debian/changelog文件(或debian/control)以获取软件包版本号的最可靠方式?类似于以下内容:
pkgver=$(dpkg-parsechangelog | magic_goes_here)

我想提取版本号(仅仅是版本号),以便在脚本中进行操作。
我原本期望能找到一个用于此目的的dpkg-*实用程序,但我还没有找到。
4个回答

如果您使用的是1.17.0或更高版本,您可以使用。
dpkg-parsechangelog --show-field Version

不需要进一步处理输出。此版本目前(2014年2月)可在Debian Testing中使用。

1@RichardHansen:非常抱歉,事实证明在Debian Stable版本中并没有该旗标可用。 - Martin Geisler
同样适用于Ubuntu 12.04。但在Ubuntu 14.04中已经存在。 - Stefan

有很多种方法可以做到这一点。
或者,你也可以选择以下方式之一:
dpkg-parsechangelog | sed -n 's/^Version: //p'
或者
dpkg-parsechangelog | grep Version: | cut -d' ' -f2-

我希望有一个更加健壮的解释——deb-control(5)手册并没有清晰地描述格式,我不想进行任何假设。例如,它没有明确指出字段必须从新行开始("Fields are delimited only by field tags.")。它还说一个字段可以跨越多行,并且没有提到标签和值之间的间距,所以也许Version:123应该被解释为前一个字段的延续而不是独立的 Version 字段(因为冒号后面没有空格)。 - Richard Hansen
实际上,dpkg-parsechangelog 的输出看起来会像这样:Version: 0.6.11-2。如果你想要更强大的解析 debian/control 格式的工具,你可以使用 python-debian 或者 libparse-debcontrol-perl - andrewsomething

dpkg-parsechangelog工作正常,之前的答案通过sed/grep来处理输出应该完全可靠。如果你想了解dpkg-parsechangelog输出的格式细节,以及大多数其他debian风格的控制文件,请参考RFC 822。deb软件包版本中不能包含换行符、空格或任何其他特殊或控制字符(参见man deb-version),因此输出中的"Version: blah"行将始终存在,并且始终是一行独立的。

然而,dpkg-parsechangelog是一个非常复杂的程序,只为从更改日志中获取当前版本号而运行。它必须运行Perl并加载大量库才能给你一个结果,其中大部分你都不会使用。在较慢的平台上,或者使用较慢的文件存储介质,或者当你需要多次进行版本解析时,它将变得非常缓慢。相反,只需使用第一行括号内的内容:

head -1 debian/changelog | awk -F'[()]' '{print $2}'

这将为您提供正确的当前软件包版本,使用标准格式获取任何有效的changelog文件(对于所有实际一般目的来说,非标准的debian/changelog格式从未被使用)。

根据我所见,软件包版本信息通常位于changelog文件的头部。因此,你可以这样做。
pkgver=$(dpkg-parsechangelog | head

我已经尝试过这个命令来查看已安装的软件包,例如:
aptitude changelog shutter | head

&

jai@frank-Jai:~$ aptitude changelog shutter | head
Get: Changelog of shutter
shutter (0.89.0-0ubuntu1) quantal; urgency=low

  * New upstream release.
   - Adds an AppIndicator (LP: #805464).
  * debian/control: Recommend libgtk2-appindicator-perl

 -- Andrew Starr-Bochicchio <a.starr.b@gmail.com>  Sat, 11 Aug 2012 17:36:18 -0400

shutter (0.88.3-1) unstable; urgency=low
jai@frank-Jai:~$ 

1我只想要版本号,仅仅版本号,这样我才能在脚本中进行操作。 - Richard Hansen