Проверьте, все ли перечисленные пакеты установлены в bash

9

Мой двоичный файл зависит от этих библиотек наддува и соответствующих пакетов:

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

Итак, я хотел бы определить список пакетов:

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

А теперь я хотел бы проверить, все ли они установлены, и только потом запускать актуально apt-get install. Я знаю, что apt автоматически проверит, установлены ли пакеты, но я хотел бы указать пользователю, хочет ли он установить недостающие библиотеки, прежде чем делать это.

Так есть ли хороший способ проверить, установлены ли все перечисленные библиотеки (в переменной, как указано выше)?

Томаш Зато - Восстановить Монику
источник
Создайте правильный пакет Debian и позвольте apt обрабатывать зависимости
ivanivan
@ivanivan Это внутреннее приложение компании и, конечно, не с открытым исходным кодом.
Томаш Зато - Восстановить Монику
Это не значит, что вам нужно распространять файл deb или что-то еще за пределами вашей внутренней компании ... просто используйте разрешение зависимостей систем упаковки. Черт возьми, используйте метод на этом q / a, чтобы создать поддельный пакет для установки deps - unix.stackexchange.com/questions/318117/…
ivanivan

Ответы:

13

Команда dpkg -sвозвращает статус установленных пакетов. Например, в моей системе, если я запускаю ее, для firefoxкоторой установлено, а neditчто нет, я получаю:

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

Таким образом, вы можете использовать эту команду, чтобы проверить, установлен ли пакет:

#!/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 / C ++ я бы сделал installed = installed || isInstalled(libArray[i]). Точно так же я хотел бы поместить false в переменную, если один или несколько не были установлены. Я думаю, что я могу сделать это if, но это много кода для ничего.
Томаш Зато - Восстановить Монику
@ TomášZato да, но ты должен быть более конкретным. Вы хотите сохранить список отсутствующих библиотек? Достаточно ли одного? Лично я бы просто проверил, все ли установлены, и если хотя бы один не установлен, запустите apt-get installвсе из них. Все, что установлено, будет просто проигнорировано. Дайте мне знать, что вы хотите, и я отредактирую это. В принципе, вам нужно изменить , || echo ...чтобы || installed=1или что - то.
Тердон
Я хотел сделать именно то, что вы делаете, это напрасная попытка сохранить список отсутствующих библиотек. Просто проверьте все и, если таковые отсутствуют, предложите пользователю apt-get. Я уже получил ваш код, работающий с уродливым ifоператором, но переменная будет предпочтительнее. Я планирую превратить это в функцию.
Томаш Зато - Восстановить Монику
@ TomášZato Хорошо, взгляните на обновленный ответ. Я немного упростил это, поскольку dpkg -sмогу проверять сразу несколько пакетов.
Тердон
1

Я сделал эту функцию для системы CentOS сегодня.

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

Ну, я немного изменил функцию. Быстрее и не нужно больше петли.

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

Аналог 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

Следующее даст вам список всех соответствующих пакетов, которые не установлены:

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

Это пропускает dpkg -lстроки заголовка, а затем выводит строки, в которых dpkg-query жалуется на неизвестный пакет, и строки, не начинающиеся с hiили ii(Hold Inst или Install Inst).

Обычно я хотел бы сделать что-то подобное awk 'NR<=5 {next} ; ...'или sed -e '1,5d'избавиться от dpkg -lстрок заголовка в России, но в этом случае мы перенаправляем stderr в stdout, чтобы получать жалобы, dpkg-queryа также dpkg -lвывод, поэтому мы не можем просто удалить первый 5 строк.

Это покажет пакеты, которые никогда не устанавливались, не удалялись, не удалялись, или где установка не удалась / частично завершена из-за ошибки.

саз
источник
0

В своей работе я использую следующий код под названием Easy Bash , который помогает быстро установить самые популярные пакеты на серверах Ubuntu. Этот код будет проверять установленные пакеты или нет.

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

Результат:

введите описание изображения здесь

Терри Лин
источник
Добро пожаловать на сайт, и спасибо за ваш вклад. Тем не менее, пожалуйста, избегайте публикации скриншотов вывода консоли , а вместо этого копируйте и вставляйте их с правильным форматированием ...
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
источник
Вопрос был не в том, чтобы проверить, установлен ли один пакет.
Гюнтберт,