Проверка установленных пакетов и, если они не найдены, установка

Мне нужно проверить установленные пакеты и, если они не установлены, установить их.

Пример для RHEL, CentOS, Fedora:

rpm -qa | grep glibc-static
glibc-static-2.12-1.80.el6_3.5.i686

Как мне сделать чек в BASH?

Мне что-то нравится?

if [ "$(rpm -qa | grep glibc-static)" != "" ] ; then

А что мне нужно использовать для других дистрибутивов? apt-get?


person amanada.williams    schedule 09.10.2012    source источник
comment
Почему бы просто не сделать их обязательными для ваших пакетов, а менеджер пакетов позаботится обо всем этом?   -  person Ignacio Vazquez-Abrams    schedule 09.10.2012
comment
Это простой сценарий установки bash для автоматизации некоторых вещей. :)   -  person amanada.williams    schedule 09.10.2012


Ответы (4)


Попробуйте следующий код:

if ! rpm -qa | grep -qw glibc-static; then
    yum install glibc-static
fi

или короче:

rpm -qa | grep -qw glibc-static || yum install glibc-static

Для лайков debian:

dpkg -l | grep -qw package || apt-get install package

Для Archlinux:

pacman -Qq | grep -qw package || pacman -S package
person Gilles Quenot    schedule 09.10.2012
comment
Без звука + только слова целиком, а не только части слов - person Gilles Quenot; 31.03.2015
comment
Привет всем, я использовал этот код в другом и обнаружил, что он не различает частичные совпадения. в моем случае (RedHat) у меня был установлен пакет file-libs, но не file, чего я хотел; когда ставил rpm -qa | grep -qw file || yum install -y file, то file не установился. Лучшее решение - вообще не использовать grep. Просто используйте что-то вроде этого: rpm --quiet --query file || yum install -y file - person Adam Burley; 06.12.2017

Основываясь на ответах @GillesQuenot и @Kidbulra, вот пример того, как перебрать несколько пакетов и установить, если он отсутствует:

packageList="git gcc python-devel"

for packageName in $packageList; do
  rpm --quiet --query $packageName || sudo yum install -y $packageName
done
person Noam Manos    schedule 08.03.2018

if [ $(yum list installed | cut -f1 -d" " | grep --extended '^full name of package being checked$' | wc -l) -eq 1 ]; then
  echo "installed";
else
  echo "missing"
fi

Я использую это, потому что он возвращает установленный / отсутствующий, не полагаясь на состояние ошибки (что может вызвать проблемы в сценариях, использующих подход «без толерантности» к ошибкам через

set -o errexit

Например)

person Pancho    schedule 28.05.2018

Если вы делаете это против загруженных RPM. вы можете сделать это.

rpm -Uvh package-name-version-tag.rpm
person diyoda_    schedule 25.09.2018