Periksa apakah semua paket yang terdaftar dipasang di bash

9

Biner saya bergantung pada peningkatan pustaka ini dan paket masing-masing:

NAME                                  |          PACKAGE:
--------------------------------------+-----------------------------------
libboost_serialization.so.1.55.0      |  libboost-serialization1.55.0
libboost_thread.so.1.55.0             |  ibboost-thread1.55.0
libboost_date_time.so.1.55.0          |  libboost-date-time1.55.0
libboost_signals.so.1.55.0            |  libboost-signals1.55.0

Jadi saya ingin mendefinisikan daftar paket:

boostlibnames="libboost-serialization1.55.0 libboost-thread1.55.0 libboost-date-time1.55.0 libboost-signals1.55.0"

Dan sekarang saya ingin memeriksa apakah semuanya sudah terinstal dan baru kemudian dijalankan apt-get install. Saya tahu apt akan secara otomatis memeriksa apakah paket-paket tersebut sudah diinstal, tetapi saya ingin memberi konfirmasi kepada pengguna apakah ia ingin menginstal pustaka yang hilang sebelum melakukannya.

Jadi apakah ada cara yang bagus untuk memeriksa apakah semua pustaka yang terdaftar (dalam variabel seperti di atas) diinstal?

Tomáš Zato - Pasang kembali Monica
sumber
Buat paket Debian yang tepat dan biarkan menangani dependensi
ivanivan
@ivanivan Ini adalah aplikasi internal perusahaan dan tentu saja bukan open-source.
Tomáš Zato - Reinstate Monica
Tidak berarti Anda harus mendistribusikan file deb atau apa pun di luar perusahaan internal Anda ... cukup gunakan penyelesaian ketergantungan sistem pengemasan. Heck, gunakan metode pada q / a ini untuk membuat paket palsu untuk mendapatkan deps diinstal - unix.stackexchange.com/questions/318117/…
ivanivan

Jawaban:

13

The dpkg -sperintah mengembalikan status paket yang diinstal. Sebagai contoh, pada sistem saya, jika saya menjalankannya untuk firefoxyang diinstal dan nedityang tidak, saya mendapatkan:

$ dpkg -s firefox
Package: firefox
Status: install ok installed
Priority: optional
Section: web
Installed-Size: 94341
Maintainer: Clement Lefebvre <root@linuxmint.com>
Architecture: amd64
Version: 41.0~linuxmint1+betsy
Replaces: firefox-l10n-af, firefox-l10n-ar, firefox-l10n-be, firefox-l10n-bg, firefox-l10n-bn-bd, firefox-l10n-ca, firefox-l10n-cs, firefox-l10n-da, firefox-l10n-de, firefox-l10n-el, firefox-l10n-en-gb, firefox-l10n-en-us, firefox-l10n-eo, firefox-l10n-es, firefox-l10n-et, firefox-l10n-eu, firefox-l10n-fa, firefox-l10n-fi, firefox-l10n-fr, firefox-l10n-fy, firefox-l10n-gl, firefox-l10n-gu, firefox-l10n-he, firefox-l10n-hi, firefox-l10n-hr, firefox-l10n-hu, firefox-l10n-id, firefox-l10n-is, firefox-l10n-it, firefox-l10n-ja, firefox-l10n-kn, firefox-l10n-ko, firefox-l10n-lt, firefox-l10n-lv, firefox-l10n-nb, firefox-l10n-nl, firefox-l10n-nn, firefox-l10n-pl, firefox-l10n-pt, firefox-l10n-pt-br, firefox-l10n-ro, firefox-l10n-ru, firefox-l10n-sk, firefox-l10n-sl, firefox-l10n-sq, firefox-l10n-sr, firefox-l10n-sv, firefox-l10n-th, firefox-l10n-tr, firefox-l10n-uk, firefox-l10n-zh
Provides: gnome-www-browser, www-browser
Breaks: firefox-l10n-en-us
Description: The Firefox web browser
 The Mozilla Firefox Web Browser.

$ dpkg -s nedit
dpkg-query: package 'nedit' is not installed and no information is available
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.

Jadi, Anda dapat menggunakan perintah itu untuk memeriksa apakah suatu paket diinstal:

#!/usr/bin/env bash

run_install()
{
    ## Prompt the user 
    read -p "Do you want to install missing libraries? [Y/n]: " answer
    ## Set the default value if no answer was given
    answer=${answer:Y}
    ## If the answer matches y or Y, install
    [[ $answer =~ [Yy] ]] && apt-get install ${boostlibnames[@]}
}

boostlibnames=("libboost-serialization1.55.0" "libboost-thread1.55.0"
                "libboost-date-time1.55.0" "libboost-signals1.55.0" "nedit")
## Run the run_install function if sany of the libraries are missing
dpkg -s "${boostlibnames[@]}" >/dev/null 2>&1 || run_install
terdon
sumber
Apakah ada cara singkat untuk menyimpan hasil? Misalnya. di C / C ++ saya akan lakukan installed = installed || isInstalled(libArray[i]). Demikian juga, saya ingin memasukkan false dalam variabel jika satu atau lebih tidak diinstal. Saya pikir saya bisa melakukan ini dengan if, tapi itu banyak kode tanpa biaya.
Tomáš Zato - Reinstate Monica
@ TomášZato ya, tetapi Anda harus lebih spesifik. Apakah Anda ingin menyimpan daftar perpustakaan yang hilang? Apakah cukup satu saja? Secara pribadi, saya hanya akan memeriksa apakah semua sudah diinstal dan jika setidaknya satu tidak, jalankan apt-get installsemuanya. Apa pun yang diinstal hanya akan diabaikan. Beri tahu saya apa yang Anda inginkan dan saya akan mengedit ini. Pada dasarnya, Anda harus mengubah || echo ...to || installed=1atau sesuatu.
terdon
Saya ingin melakukan persis apa yang Anda lakukan, itu usaha sia-sia untuk menyimpan daftar perpustakaan yang hilang. Cukup periksa semuanya, dan jika ada yang hilang, beri tahu pengguna untuk melakukan apt-get. Saya sudah mendapatkan kode Anda bekerja dengan ifpernyataan jelek , tetapi variabel akan lebih disukai. Saya berencana untuk membungkusnya menjadi sebuah fungsi.
Tomáš Zato - Reinstate Monica
@ TomášZato OK, lihat jawaban yang diperbarui. Saya sedikit menyederhanakan karena dpkg -sdapat memeriksa beberapa paket sekaligus.
terdon
1

Saya melakukan fungsi ini untuk sistem CentOS hari ini.

#!/bin/bash

# List of the packages that should be present
list=("vim-enhanced" "nano" "expect" "dialog" "epel-release" "yum-utils" "bind-utils")

# Check for the existence of the packages in the system and print to file.txt the packages to be installed
check_list=$(rpm -q "${list[@]}" | grep -e "not installed" | awk 'BEGIN { FS = " " } ; { print $2}' > list.txt)

# Check if the list.txt is empty
grep -q '[^[:space:]]' < list.txt
EMPTY_FILE=$?
# If list.txt is empty there's nothing to do
if [[ $EMPTY_FILE -eq 1 ]]; then

echo "Nothing to do"

else

# If list.txt is not empty it installs the packages in list.txt

for PACKAGES in `cat /your/path/list.txt`; do

  yum install -y $PACKAGES

done

fi

Yah, saya sedikit mengubah fungsinya. Lebih cepat dan tidak perlu loop lagi.

#!/bin/bash


list=("vim-enhanced" "nano" "expect" "dialog" "epel-release" "yum-utils" "bind-utils")
check_list=$(rpm -q "${list[@]}" | grep -e "not installed" | awk 'BEGIN { FS = " " } ; { printf $2" "}' > /your/path/to/list.txt)
install=$(cat /your/path/to/list.txt)

grep -q '[^[:space:]]' < /your/path/to/list.txt

EMPTY_FILE=$?

if [[ $EMPTY_FILE -eq 1 ]]; then

echo "Nothing to do"

else

yum install -y $install

fi

Mitra Debian / Ubuntu:

apt -qq YOUR_LIST_GOES_HERE | grep -v "installed" | awk -F/ '{print $1}' > /your/path/to/list.txt
packages=$(cat /your/path/to/list.txt)
grep -q '[^[:space:]]' < /your/path/to/list.txt
EMPTY_FILE=$?
if [[ $EMPTY_FILE -eq 1 ]]; then
echo "Nothing to do"
else
apt-get  install -y $packages
fi
Claudio Taccogna
sumber
0

Berikut ini akan memberi Anda daftar semua paket yang relevan yang tidak diinstal:

dpkg -l $boostlibnames 2>&1 | awk '{if (/^D|^\||^\+/) {next} else if(/^dpkg-query:/) { print $6} else if(!/^[hi]i/) {print $2}}' 

Ini melompati dpkg -lbaris tajuk, dan kemudian mencetak garis tempat dpkg-query mengeluhkan paket yang tidak dikenal, DAN garis yang tidak dimulai dengan hiatau ii(Tahan Inst atau Instal Inst).

Biasanya, saya akan melakukan sesuatu seperti awk 'NR<=5 {next} ; ...'atau sed -e '1,5d'untuk menghilangkan dpkg -lbaris header tetapi dalam kasus ini kita mengarahkan stderr ke stdout untuk menangkap keluhan dengan dpkg-queryjuga dpkg -lkeluaran, jadi kita tidak bisa begitu saja menghapus yang pertama 5 baris.

Ini akan menunjukkan paket baik tidak pernah diinstal, dihapus, dibersihkan, atau di mana instalasi gagal / sebagian-selesai karena kesalahan.

cas
sumber
0

Saya menggunakan kode berikut dalam pekerjaan saya yang disebut Easy Bash , yang membantu menginstal paket paling cepat di server Ubuntu. Kode ini akan memeriksa paket yang terdaftar sudah terpasang atau belum.

#!/usr/bin/env bash

packages=("curl" "gnupg2" "ca-certificates" "lsb-release")

for pkg in ${packages[@]}; do

    is_pkg_installed=$(dpkg-query -W --showformat='${Status}\n' ${pkg} | grep "install ok installed")

    if [ "${is_pkg_installed}" == "install ok installed" ]; then
        echo ${pkg} is installed.
    fi
done

Hasil:

masukkan deskripsi gambar di sini

Terry Lin
sumber
Selamat datang di situs ini, dan terima kasih atas kontribusi Anda. Tetap saja, harap hindari memposting tangkapan layar keluaran konsol , dan salin-dan-pase dengan pemformatan yang benar sebagai gantinya ...
AdminBee
-1
#to check package is installed or not without distribution dependency
#!/bin/bash
read -p "Package Name: " pkg
which $pkg > /dev/null 2>&1
if [ $? == 0 ]
then
echo "$pkg is already installed. "
else
read -p "$pkg is not installed. Answer yes/no if want installation_ " request
if  [ $request == "yes" ]
then
yum install $pkg
fi
fi
linux.cnf
sumber
Pertanyaannya bukan tentang memeriksa apakah satu paket sudah diinstal.
guntbert