Kiểm tra nếu tất cả các gói được liệt kê được cài đặt trong bash


9

Nhị phân của tôi phụ thuộc vào các thư viện tăng cường và các gói tương ứng:

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

Vì vậy, tôi muốn xác định một danh sách các gói:

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

Và bây giờ tôi muốn kiểm tra xem tất cả chúng đã được cài đặt chưa và chỉ sau đó chạy thực tế apt-get install. Tôi biết apt sẽ tự động kiểm tra xem các gói đã được cài đặt chưa, nhưng tôi muốn đặt một dấu nhắc cho người dùng xem anh ta có muốn cài đặt các thư viện bị thiếu hay không trước khi thực hiện.

Vì vậy, có một cách hay để kiểm tra xem tất cả các thư viện được liệt kê (trong biến như trên) đã được cài đặt chưa?


Tạo một gói Debian thích hợp và để apt xử lý các phụ thuộc
ivanivan

@ivanivan Đây là một ứng dụng nội bộ của công ty và tất nhiên không phải là nguồn mở.
Tomáš Zato - Phục hồi Monica

Không có nghĩa là bạn phải phân phối tệp gỡ lỗi hoặc bất kỳ thứ gì khác ngoài công ty nội bộ của bạn ... chỉ cần sử dụng giải quyết phụ thuộc hệ thống đóng gói. Heck, sử dụng phương thức trên q / a này để tạo gói giả để cài đặt deps - unix.stackexchange.com/questions/318117/NH
ivanivan

Câu trả lời:


13

Các dpkg -slệnh trả về trạng thái của các gói cài đặt. Ví dụ: trên hệ thống của tôi, nếu tôi chạy nó firefoxđược cài đặt và không cài đặt nedit, tôi nhận được:

$ 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.

Vì vậy, bạn có thể sử dụng lệnh đó để kiểm tra xem gói đã được cài đặt chưa:

#!/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

Có một số cách ngắn để lưu kết quả? Ví dụ. trong C / C ++ tôi sẽ làm installed = installed || isInstalled(libArray[i]). Tương tự như vậy, tôi muốn đặt false vào một biến nếu một hoặc nhiều người không được cài đặt. Tôi nghĩ rằng tôi có thể làm điều này với if, nhưng đó là rất nhiều mã không có gì.
Tomáš Zato - Phục hồi Monica

@ TomášZato có, nhưng bạn sẽ phải cụ thể hơn. Bạn có muốn lưu danh sách các thư viện bị thiếu? Là một đủ? Cá nhân, tôi sẽ chỉ kiểm tra xem tất cả đã được cài đặt chưa và nếu ít nhất một cái không, hãy chạy apt-get installtrên tất cả chúng. Bất kỳ được cài đặt sẽ chỉ đơn giản là bị bỏ qua. Hãy cho tôi biết những gì bạn muốn và tôi sẽ chỉnh sửa điều này. Về cơ bản, bạn sẽ cần thay đổi || echo ...thành || installed=1hoặc một cái gì đó.
terdon

Tôi muốn làm chính xác những gì bạn làm, thật lãng phí công sức để lưu danh sách các thư viện bị thiếu. Chỉ cần kiểm tra tất cả, và nếu thiếu, nhắc người dùng cho apt-get. Tôi đã có mã của bạn làm việc với ifcâu lệnh xấu xí , nhưng biến sẽ được xử lý trước. Tôi có kế hoạch bọc nó vào một chức năng.
Tomáš Zato - Phục hồi Monica

@ TomášZato OK, hãy xem câu trả lời được cập nhật. Tôi đã đơn giản hóa nó một chút vì dpkg -scó thể kiểm tra nhiều gói cùng một lúc.
terdon

1

Tôi đã làm chức năng này cho một hệ thống CentOS ngày hôm nay.

#!/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

Vâng, tôi hơi sửa đổi chức năng. Nhanh hơn và nó không cần một vòng lặp nữa.

#!/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

Bản sao 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

0

Sau đây sẽ cung cấp cho bạn một danh sách tất cả các gói có liên quan chưa được cài đặt:

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

Điều này bỏ qua dpkg -lcác dòng tiêu đề, và sau đó in ra các dòng trong đó truy vấn dpkg phàn nàn về một gói không xác định, các dòng AND không bắt đầu bằng hihoặc ii(Giữ Inst hoặc Cài đặt Inst).

Thông thường, tôi sẽ làm một cái gì đó như awk 'NR<=5 {next} ; ...'hoặc sed -e '1,5d'để loại bỏ các dpkg -ldòng tiêu đề nhưng trong trường hợp này, chúng tôi chuyển hướng stderr sang stdout để bắt các khiếu nại dpkg-querycũng như dpkg -lđầu ra, vì vậy chúng tôi không thể xóa cái đầu tiên 5 dòng.

Điều này sẽ hiển thị các gói không bao giờ được cài đặt, gỡ bỏ, thanh lọc hoặc nơi cài đặt bị lỗi / hoàn thành một phần do lỗi.


0

Tôi sử dụng đoạn mã sau trong công việc của mình có tên Easy Bash , giúp cài đặt nhanh chóng các gói phổ biến nhất trên các máy chủ Ubuntu. Mã này sẽ kiểm tra các gói được liệt kê cài đặt hay không.

#!/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

Kết quả:

nhập mô tả hình ảnh ở đây


Chào mừng đến với trang web, và cảm ơn bạn đã đóng góp. Tuy nhiên, vui lòng tránh đăng ảnh chụp màn hình của đầu ra giao diện điều khiển và sao chép và sao chép nó với định dạng phù hợp thay vào đó ...
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

Câu hỏi không phải là về việc kiểm tra nếu một gói duy nhất đã được cài đặt.
guntbert
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.