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


11

解析源软件包debian/changelog文件(或debian/control?)以获得软件包版本号的最可靠方法是什么?就像是:

pkgver=$(dpkg-parsechangelog | magic_goes_here)

我想提取版本号(并且提取版本号),以便可以在脚本中对其进行操作。

我原本希望找到一种dpkg-*用于此目的的实用程序,但还没有找到。

Answers:


18

如果您具有1.17.0或更高版本,则可以使用

dpkg-parsechangelog --show-field Version

然后无需进一步处理输出。该版本目前(2014年2月)在Debian Testing中可用。


1
@RichardHansen:很抱歉,事实证明该标志在Debian Stable中的版本中不可用。
马丁·盖斯勒

与Ubuntu 12.04相同。它在Ubuntu 14.04中存在。
Stefan

7

有很多方法可以做到这一点。

dpkg-parsechangelog | sed -n 's/^Version: //p'

或者:

dpkg-parsechangelog | grep Version: | cut -d' ' -f2-


我希望有一些更强大的功能- deb-control(5)手册页中没有明确描述格式,我也不想做任何假设。例如,它并不清楚字段必须在一行上开始(“字段仅由字段标签定界。”)。它还说一个字段可以跨越多行,并且没有说明标签和值之间的间距,因此Version:123应该将其解释为前一个字段的延续,而不是单独的Version字段(由于缺少)冒号后面的空格)。
理查德·汉森

在实践中,的输出dpkg-parsechangelog看起来像Version: 0.6.11-2如果您想对debian/control格式进行更健壮的解析,则可以使用python-debianlibparse-debcontrol-perl
andrewsomething

1

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对于所有实际通用目的,从不使用非标准格式)。


-1

如我所见,软件包版本位于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
需要版本号,以便可以在脚本中对其进行操作。
理查德·汉森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.