Làm cách nào để trích xuất phiên bản gói từ debian / changelog?


11

Cách mạnh nhất để phân tích debian/changelogtệp của gói nguồn (hoặc debian/control?) Để lấy số phiên bản của gói là gì? Cái gì đó như:

pkgver=$(dpkg-parsechangelog | magic_goes_here)

Tôi muốn trích xuất số phiên bản (và chỉ số phiên bản) để tôi có thể thao tác nó trong một tập lệnh.

Tôi đã mong đợi tìm thấy một dpkg-*tiện ích cho mục đích này, nhưng tôi chưa tìm thấy một tiện ích nào.

Câu trả lời:


18

Nếu bạn có phiên bản 1.17.0 trở lên, bạn có thể sử dụng

dpkg-parsechangelog --show-field Version

Không cần xử lý đầu ra sau đó. Phiên bản này hiện tại (tháng 2 năm 2014) có sẵn trong Thử nghiệm Debian.


1
@RichardHansen: Xin lỗi về điều đó, hóa ra cờ không có sẵn trong phiên bản có trong Debian Stable.
Martin Geisler

Tương tự cho Ubuntu 12.04. Nó có mặt trong Ubuntu 14.04.
Stefan

7

Có rất nhiều cách để làm điều này.

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

Hay cách khác:

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


Tôi đã hy vọng cho một cái gì đó mạnh mẽ hơn một chút - deb-control(5)trang người đàn ông không mô tả rõ ràng định dạng và tôi không muốn đưa ra bất kỳ giả định nào. Ví dụ: không nói rõ rằng các trường phải bắt đầu trên một dòng ("Các trường chỉ được phân tách bằng các thẻ trường."). Nó cũng nói rằng một trường có thể trải rộng trên nhiều dòng và nó không nói gì về khoảng cách giữa thẻ và giá trị, vì vậy có thể Version:123được hiểu là sự tiếp nối của trường trước đó và không phải là trường Phiên bản riêng biệt (do thiếu của một không gian sau dấu hai chấm).
Richard Hansen

Trong thực tế, đầu ra từ dpkg-parsechangelogsẽ trông giống như Version: 0.6.11-2Nếu bạn muốn một cái gì đó thực hiện phân tích cú pháp debian/controlđịnh dạng mạnh mẽ hơn , bạn có thể sử dụng python-debianhoặc libparse-debcontrol-perl.
andrews Something 15/08/13

1

dpkg-parsechangeloghoạt động, và câu trả lời trước đó dẫn đầu ra thông qua sed / grep nên hoàn toàn mạnh mẽ. Nếu bạn muốn biết chi tiết chính xác về định dạng dpkg-parsechangelogđầu ra và hầu hết các tệp điều khiển kiểu debian khác, hãy xem RFC 822 . Phiên bản gói gỡ lỗi không bao giờ có dòng mới, dấu cách hoặc bất kỳ ký tự điều khiển hoặc đặc biệt nào khác (xem man deb-version), do đó, dòng " Version: blah" trong đầu ra sẽ luôn xuất hiện và nó sẽ luôn là một dòng trên nó sở hữu.

Tuy nhiên, dpkg-parsechangeloglà một chương trình rất nặng để chạy chỉ để lấy số phiên bản hiện tại từ một thay đổi. Nó phải chạy Perl và tải một số lượng lớn các thư viện ấn tượng để cung cấp cho bạn một kết quả, hầu hết trong số đó bạn sẽ không sử dụng. Trên các nền tảng chậm hơn hoặc với phương tiện lưu trữ tệp chậm hoặc khi bạn cần thực hiện phiên bản này phân tích cú pháp nhiều lần, nó sẽ tỏ ra khá chậm. Thay vào đó, chỉ cần sử dụng bất cứ thứ gì nằm trong bộ dấu ngoặc đầu tiên trên dòng đầu tiên:

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

Điều đó sẽ giúp bạn có phiên bản gói hiện tại chính xác với bất kỳ changelogtệp hợp lệ nào sử dụng định dạng chuẩn (và các debian/changelogđịnh dạng không chuẩn là, cho tất cả các mục đích chung thực tế, không bao giờ được sử dụng).


-1

như tôi đã thấy phiên bản gói bao gồm phần tiêu đề của tệp changelog. vì vậy bạn có thể làm điều đó như

pkgver=$(dpkg-parsechangelog | head

Tôi đã thử lệnh này cho các gói đã cài đặt, ví dụ

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
Tôi muốn số phiên bản và chỉ số phiên bản để tôi có thể thao tác nó trong một tập lệnh.
Richard Hansen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.