Làm thế nào để kiểm tra chính xác nếu gói được cài đặt trong yum?


56

Tôi tiếp tục nhận được câu trả lời như:

yum list installed | grep bind

hoặc là

rpm -qa | grep bind

Nhưng điều đó không chính xác vì tôi nhận được một danh sách một vài gói ràng buộc khác như sau:

bind-utils-9.8.2-0.17.rc1.el6_4.5.x86_64
rpcbind-0.2.0-11.el6.x86_64
bind-libs-9.8.2-0.17.rc1.el6_4.5.x86_64
samba-winbind-3.6.9-151.el6.x86_64
samba-winbind-clients-3.6.9-151.el6.x86_64
ypbind-1.20.4-30.el6.x86_64

Đó không phải là tôi muốn. Thay vào đó tôi muốn kiểm tra chính xác nếu gói lõi ràng buộc đã được cài đặt. Ví dụ.bind.x86_64 32:9.8.2-0.17.rc1.el6_4.6

Tôi đã hy vọng cho một cái gì đó như:

yum check installed bind

Nhưng hy vọng ai đó có thể làm sáng tỏ.

Câu trả lời:


61

Bạn đã thử điều này?

$ yum list installed bind

Tôi đang nhận Error: No matching Packages to list$?trả về 1, và khi tôi đã thử yum list installed bind-libs, $?trả về 0. Điều này sẽ đúng cho đến nay. Tôi có thể kết luận một cách an toàn lệnh của bạn là xác định chính xác một gói được cài đặt không? Tôi đã tìm ra rpm -q bindngay bây giờ. Nó cũng tương đương với lệnh của bạn?
tổng kiểm tra

Đó là AFAIK chính xác, chỉ thoát mã 0 nếu gói được cài đặt.
plasmid87

Tôi nghĩ rằng điều này đang làm việc. Và tôi thích các giải pháp dòng đơn
checksum

Tôi nghĩ rằng lệnh chính xác là với một ký tự đại diện: yum list installed bind*
Alejandro Angelico

2
@NoahSussman Bạn có thể cố gắng yum -C list installed bindtránh mạng. Điều này giữ cho tất cả các plugin được bật (chỉ trong trường hợp bạn có bất kỳ thứ gì kỳ lạ ảnh hưởng đến việc tra cứu trong yumdb) và cũng cho bạn biết gói repo được cài đặt từ
plasmid87

13

Có một cách dễ dàng hơn để ban hành truy vấn này: rpm -qa | grep bindhoặc rpm -q bind. Cái trước là tốt nhất nếu bạn không hoàn toàn chắc chắn về tên gói.


4
+1 đối với rpm -q $packagetôi tin rằng đây là giải pháp nhanh nhất và nhanh nhất, vì làm bất cứ điều gì có yumthể buộc cập nhật bộ đệm (thường là chậm).
Alex S

Giải pháp này (sử dụng rpm) phải là câu trả lời được chấp nhận vì nó trả về trạng thái thoát sạch và không yêu cầu gọi ra một loạt các URL từ xa như các yumgiải pháp đã làm.

1
@NoahSussman Các mã lối ra cho yumrpmlàm theo các hành vi tương tự trong tất cả các ví dụ tôi có thể nghĩ đến (0 = cài đặt, 1 = không được cài đặt / lỗi) nên nó sẽ hữu ích để biết nếu bạn đang nhìn thấy một mã lối ra khác nhau. Vui lòng xem phản hồi của tôi ở trên về việc sử dụng bộ đệm để tránh truy cập mạng
plasmid87

@ plasmid87 Tôi không biết tôi có thể sử dụng yum -Cđể ngăn yum dành tất cả thời gian thêm đó để liên lạc với các máy chủ mạng. Cảm ơn bạn, bây giờ tôi thấy làm thế nào yum và vòng / phút có thể được sử dụng thay thế cho nhau ở đây !!

9

Phân tích kết quả của lệnh này là câu trả lời đầy đủ nhất. Bạn sẽ cần phải biết tên gói chính xác.

yum info bind

Loaded plugins: refresh-packagekit, rhnplugin
This system is receiving updates from RHN Classic or RHN Satellite.
Installed Packages
Name        : bind
Arch        : x86_64
Epoch       : 32
Version     : 9.8.2
Release     : 0.17.rc1.el6_4.6
Size        : 7.3 M
Repo        : installed
From repo   : rhel-x86_64-workstation-6
Summary     : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server
URL         : http://www.isc.org/products/BIND/
License     : ISC
Description : BIND (Berkeley Internet Name Domain) is an implementation of the DNS
        : (Domain Name System) protocols. BIND includes a DNS server (named),
        : which resolves host names to IP addresses; a resolver library
        : (routines for applications to use when interfacing with DNS); and
        : tools for verifying that the DNS server is operating properly.

2
Hmm, không phải là nói với tôi bindlà có sẵn / gói yum hợp lệ thay vì cho tôi biết nếu nó được cài đặt?
tổng kiểm tra

2
Điều đó không rõ ràng, nhưng nếu được cài đặt được liệt kê dưới thẻ Repo, thì nó đã được cài đặt. Nếu không, nó sẽ liệt kê repo mà nó có sẵn từ đó.
Fred the Magic Wonder Dog

Điều này dẫn đến việc kết nối với repos yum từ xa khi tất cả những gì tôi muốn là xem những gì đang xảy ra trên máy cục bộ của tôi .

1

Cách tốt nhất mà tôi nghĩ ra để làm điều này (rất tốt để sử dụng nhanh chóng trong các tập lệnh) là:

yum info <package_name> | grep Repo | awk '{ print $3 }'

Ví dụ: nếu tôi hiện đã gitcài đặt:

yum info git | grep Repo | awk '{ print $3 }'

Điều này sẽ trở lại installed

Nếu tôi hiện khônggitcài đặt mà cùng một lệnh trước đó sẽ trở lại: base/7/x86_64đó là quá trình cài đặt có sẵn hiện tại chogit


Điều này dẫn đến việc kết nối với repos yum từ xa khi tất cả những gì tôi muốn là xem những gì đang xảy ra trên máy cục bộ của tôi .

1
@NoahSussman để liệt kê tất cả các gói được cài đặt hiện tại trên máy cục bộ của bạn mà bạn có thể sử dụng yum list installed. Từ đó bạn có thể sử dụng greplệnh để có câu trả lời chính xác hơn cho những gì bạn đang tìm kiếm. Ngoài ra nếu bạn muốn kiểm tra một gói cụ thể, bạn có thể thêm gói đó vào lệnh của mình - Ex : php70w. yum list installed php70wsẽ liệt kê thông tin trên gói đã cài đặt hoặc trả lạiNo matching Packages to list
domdambrogia

-1

Sử dụng mã Python để kiểm tra xem một gói được cài đặt trong python bằng cách sử dụng yum:

def is_installed(package_name):
    return "not installed" in commands.getstatusoutput("rpm -q " + package_name)[1]

cái này không nên not insao?
Inbar Rose

-2
yum list installed bind >/dev/null ; echo $?

Nếu kết quả là 0 (không), gói được cài đặt


Điều này rất chậm so với rpm -q bindgiải pháp thể hiện trong câu trả lời của John.

Mặc dù có lẽ sử dụng yum -C ...sẽ nhanh chóng.
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.