Bagaimana saya bisa tahu apakah sebuah paket diinstal melalui yum dalam skrip bash?

76

Saya mencoba untuk menulis skrip yang menginstal paket, tetapi jika gagal pada suatu saat nanti dalam skrip mengembalikan apa pun yang diinstal. Tentu saja jika pengguna sudah menginstal paket sebelumnya saya tidak ingin menghapusnya dari bawah mereka. Bagaimana skrip saya dapat mengetahui apakah suatu paket telah diinstal sebelumnya melalui yum?

Doktor J
sumber

Jawaban:

77

Saya menemukan berikut ini pada pertanyaan StackOverflow semi terkait ; jawaban yang saya butuhkan sebenarnya tidak cukup menjawab pertanyaan di sana (dan tidak dipilih sebagai jawaban yang benar) jadi saya pikir saya akan mempostingnya di sini agar orang lain merasa lebih mudah.

yum list installed PACKAGE_NAME

Perintah ini mengembalikan beberapa keluaran yang dapat dibaca manusia, tetapi yang lebih penting mengembalikan kode status keluar; 0 menunjukkan paket yang diinstal, 1 menunjukkan paket tersebut tidak terpasang (tidak memeriksa apakah paket tersebut valid, sehingga yum list installed herpderp-beepbopboopakan mengembalikan "1" seperti yum list installed traceroutekehendak jika Anda tidak memiliki traceroute diinstal). Anda selanjutnya dapat memeriksa "$?" untuk kode keluar ini.

Karena outputnya agak kontra-intuitif, saya menggunakan versi "condensed" @Rris Downs di bawah ini dalam fungsi wrapper untuk membuat output lebih "logis" (yaitu 1 = diinstal 0 = tidak diinstal):

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

penggunaan akan

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

SUNTING:

returnPernyataan yang diganti dengan panggilan truedan falseyang membantu membuat fungsi lebih mudah dibaca / intuitif, sambil mengembalikan nilai yang diharapkan bash (yaitu 0 untuk true, 1 untuk false).

Jika Anda hanya memeriksa satu paket dalam skrip Anda, Anda mungkin lebih baik menguji yum list installedsecara langsung, tetapi (IMHO) fungsinya membuatnya lebih mudah untuk memahami apa yang terjadi, dan sintaksnya jauh lebih mudah diingat daripada yumdengan semua pengalihan untuk menekan outputnya.

Doktor J
sumber
2
Anda tidak perlu memeriksa nilai secara manual $?, cukup bungkus perintah dengan syarat:if yum list installed "$package" >/dev/null 2>&1; then [...]
Chris Down
1
Saya pikir pernyataan gema Anda terbalik, bukan? isInstalledmengembalikan 1 jika paket diinstal; tetapi 1 dievaluasi menjadi false dalam bash sehingga "tidak diinstal" digaungkan.
FGreg
@FGreg panggilan bagus ... Saya sudah mengganti returnpernyataan dengan panggilan ke truedan false, jadi fungsinya mudah dibaca namun mengembalikan output yang diharapkan bash.
Doktor J
5
OMG adalah abad ke-21, tidak bisakah mereka memiliki opsi yang tepat untuk mengetahui apakah sebuah paket diinstal sehingga saya tidak memiliki fungsi tulis atau satu baris !?
Sunil D.
21

Tidak sepenuhnya memenuhi persyaratan pertanyaan "via yum" tetapi lebih cepat dari "daftar yum -q" adalah:

rpm -q <package_name>

yang mengembalikan nama persis versi yang mungkin diinstal serta kode kesalahan "0" jika diinstal dan "1" jika tidak.

Gerald Schade
sumber
+1 karena ini lebih cepat
Freddie Fabregas
Jelas lebih cepat, karena rpmmanajer paket lokal. yumadalah untuk menangani paket di repositori terpencil
Sergiy Kolodyazhnyy
9

Pengelana lebih sederhana:

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

Skrip praktis untuk 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

Dalam array pckarr, daftarkan paket-paket yang ingin Anda instal atau periksa apakah itu diinstal.

Ashish K Srivastava
sumber
0

Anda juga dapat membaca nilai pengembalian $?dari yum. Harus 0 jika semuanya bekerja atau positif tergantung pada masalah apa yang Anda hadapi. Ini adalah cara yang baik jika Anda ingin mengambil tindakan berbeda jika sesuatu gagal.

Demam
sumber