Làm thế nào tôi có thể biết liệu một gói được cài đặt qua yum trong tập lệnh bash?


76

Tôi đang cố gắng viết một tập lệnh cài đặt các gói, nhưng nếu nó bị lỗi tại bất kỳ thời điểm nào sau đó thì tập lệnh sẽ quay trở lại bất cứ thứ gì nó đã cài đặt. Tất nhiên, nếu người dùng đã cài đặt gói trước đó, tôi không muốn gỡ cài đặt gói đó từ bên dưới chúng. Làm thế nào kịch bản của tôi có thể cho biết một gói đã được cài đặt trước đó qua yum chưa?

Câu trả lời:


77

Tôi đã tìm thấy những điều sau đây trong câu hỏi StackOverflow bán liên quan ; câu trả lời tôi cần không thực sự trả lời câu hỏi ở đó (và không được chọn là câu trả lời đúng) vì vậy tôi đoán rằng tôi sẽ đăng nó ở đây để người khác tìm thấy dễ dàng hơn.

yum list installed PACKAGE_NAME

Lệnh này trả về một số đầu ra có thể đọc được của con người, nhưng quan trọng hơn là trả về mã trạng thái thoát; 0 cho biết gói đã được cài đặt, 1 cho biết gói chưa được cài đặt (không kiểm tra xem gói có hợp lệ hay không, do đó yum list installed herpderp-beepbopboopsẽ trả về "1" như yum list installed traceroutebạn muốn nếu bạn chưa cài đặt traceroute). Sau đó, bạn có thể kiểm tra "$?" cho mã thoát này.

Vì đầu ra hơi phản trực quan, tôi đã sử dụng phiên bản "cô đọng" của @Chris Downs bên dưới trong chức năng trình bao bọc để làm cho đầu ra trở nên "hợp lý" hơn (tức là 1 = đã cài đặt 0 = chưa cài đặt):

function isinstalled {
  if yum list installed "$@" >/dev/null 2>&1; then
    true
  else
    false
  fi
}

sử dụng sẽ là

if isinstalled $package; then echo "installed"; else echo "not installed"; fi

BIÊN TẬP:

Các returncâu lệnh được thay thế bằng các lệnh gọi truefalsegiúp làm cho hàm dễ đọc / trực quan hơn, trong khi trả về các giá trị bash mong đợi (nghĩa là 0 cho true, 1 cho false).

Nếu bạn chỉ kiểm tra một gói trong tập lệnh của mình, bạn có thể kiểm tra yum list installedtrực tiếp tốt hơn , nhưng (IMHO) chức năng giúp dễ hiểu những gì đang diễn ra và cú pháp của nó dễ nhớ hơn nhiều so yumvới tất cả các chuyển hướng để thay thế đầu ra của nó.


2
Bạn không cần phải kiểm tra thủ công giá trị của $?, chỉ cần bọc lệnh trong một điều kiện:if yum list installed "$package" >/dev/null 2>&1; then [...]
Chris Down

1
Tôi nghĩ rằng báo cáo tiếng vang của bạn là đảo ngược, không? isInstalledtrả về 1 nếu gói được cài đặt; nhưng 1 được đánh giá là sai trong bash nên "không cài đặt" được lặp lại.
FGreg

@FGreg cuộc gọi tốt ... Tôi đã thay thế các returncâu lệnh bằng các cuộc gọi đến truefalsevì vậy chức năng này có thể dễ đọc nhưng trả về kết quả bash mong đợi.
Doktor J

5
OMG là thế kỷ 21, họ không thể có một lựa chọn phù hợp để biết nếu một gói được cài đặt để tôi không có chức năng ghi hoặc một lớp lót!?
Sunil D.

21

Không hoàn thành chính xác điều kiện tiên quyết của câu hỏi "qua yum" nhưng nhanh hơn "danh sách yum -q" là:

rpm -q <package_name>

trong đó trả về tên chính xác của phiên bản có thể được cài đặt cũng như mã lỗi "0" nếu được cài đặt và "1" nếu không.


+1 vì điều này nhanh hơn
Freddie Fabregas

Chắc chắn nhanh hơn, bởi vì rpmlà người quản lý gói địa phương. yumlà để xử lý các gói trong kho từ xa
Sergiy Kolodyazhnyy

9

Đơn giản hơn

yum -q list installed packageX &>/dev/null && echo "Installed" || echo "Not installed"

0

Một kịch bản tiện dụng cho yum:

#!/bin/sh pckarr=(wget mlocate bind-utils ANY_RANDOM_PACKAGE_NAME) yum update -y for i in ${pckarr[*]} do isinstalled=$(rpm -q $i) if [ ! "$isinstalled" == "package $i is not installed" ]; then echo Package $i already installed else echo $i is not INSTALLED!!!! yum install $i -y fi done updatedb

Trong mảng pckarr, hãy liệt kê các gói mà bạn muốn cài đặt hoặc kiểm tra xem nó đã được cài đặt chưa.


0

Bạn cũng có thể đọc giá trị trả về $?từ yum. Nên là 0 nếu mọi thứ hoạt động tốt hoặc tích cực tùy thuộc vào loại vấn đề yum gặp phải. Đây là một cách tốt nếu bạn muốn thực hiện các hành động khác nhau nếu có điều gì đó không thành cô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.