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?
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.
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.
#!/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.
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.
$?
, cukup bungkus perintah dengan syarat:if yum list installed "$package" >/dev/null 2>&1; then [...]
isInstalled
mengembalikan 1 jika paket diinstal; tetapi 1 dievaluasi menjadi false dalam bash sehingga "tidak diinstal" digaungkan.return
pernyataan dengan panggilan ketrue
danfalse
, jadi fungsinya mudah dibaca namun mengembalikan output yang diharapkan bash.Tidak sepenuhnya memenuhi persyaratan pertanyaan "via yum" tetapi lebih cepat dari "daftar yum -q" adalah:
yang mengembalikan nama persis versi yang mungkin diinstal serta kode kesalahan "0" jika diinstal dan "1" jika tidak.
sumber
rpm
manajer paket lokal.yum
adalah untuk menangani paket di repositori terpencilPengelana lebih sederhana:
sumber
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.
sumber
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.sumber