Как узнать, установлен ли пакет через yum в bash-скрипте?


77

Я пытаюсь написать сценарий, который устанавливает пакеты, но если он не удается в какой-либо момент позже, сценарий откатывает все, что он установил. Конечно, если пользователь уже ранее установил пакет, я не хочу удалять его из-под них. Как мой сценарий может сказать, был ли пакет предварительно установлен через yum?

Ответы:


78

Я нашел следующее в полу-связанном вопросе StackOverflow ; ответ, который мне был нужен, на самом деле не совсем отвечал на вопрос (и не был выбран в качестве правильного ответа), поэтому я решил опубликовать его здесь, чтобы другим было проще.

yum list installed PACKAGE_NAME

Эта команда возвращает некоторый читабельный вывод, но, что более важно, возвращает код состояния выхода; 0 указывает , что пакет будет установлен, 1 указывает , что пакет не установлен (не проверяет , является ли пакет, так yum list installed herpderp-beepbopboopбудет возвращать «1» так же , как yum list installed tracerouteволя , если не установлен трассировку). Вы можете впоследствии проверить "$?" для этого кода выхода.

Поскольку вывод является несколько нелогичным, я использовал «сжатую» версию @Chris Downs ниже в функции-обертке, чтобы сделать вывод более «логичным» (т. Е. 1 = установлено 0 = не установлено):

function isinstalled {
  if yum list installed "$@" >/dev/null 2>&1; then
    true
  else
    false
  fi
}

использование будет

if isinstalled $package; then echo "installed"; else echo "not installed"; fi

РЕДАКТИРОВАТЬ:

Заменяет returnоператоры вызовами trueи falseкоторые помогают сделать функцию более читабельной / интуитивно понятной, возвращая значения, которые ожидает bash (т. Е. 0 для true, 1 для false).

Если вы просто проверяете наличие одного пакета в своем скрипте, возможно, вам лучше просто тестировать yum list installedнапрямую, но (ИМХО) функция облегчает понимание происходящего, а ее синтаксис гораздо легче запомнить, чем yumсо всеми перенаправлениями. подавить его выход.


2
Вам не нужно вручную проверять значение $?, просто оберните команду в условное выражение:if yum list installed "$package" >/dev/null 2>&1; then [...]
Крис Даун

1
Я думаю, что ваши эхо заявления поменялись местами, нет? isInstalledвозвращает 1, если пакет установлен; но 1 оценивается как ложное в bash, поэтому выводится сообщение «не установлено».
FGreg

@FGreg хороший вызов ... Я заменил returnоператоры на вызовы trueи false, так что функция легко читаема, но возвращает ожидаемый выходной bash.
Доктор J

5
О боже, это 21-й век, разве у них не может быть правильной опции, чтобы сказать, установлен ли пакет, поэтому у меня нет функций записи или одного лайнера !?
Сунил Д.

21

Не совсем соответствует предварительному условию вопроса "via yum", но быстрее, чем "yum -q list":

rpm -q <package_name>

который возвращает точное имя возможно установленной версии, а также код ошибки «0», если установлен, и «1», если нет.


+1, потому что это быстрее
Фредди Фабрегас

Определенно быстрее, потому что rpmэто локальный менеджер пакетов. yumдля работы с пакетами в удаленных репозиториях
Сергей Колодяжный

9

Проще говоря:

yum -q list installed packageX &>/dev/null && echo "Installed" || echo "Not installed"

0

Удобный скрипт для 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

В массиве pckarr перечислите те пакеты, которые вы хотите установить, или проверьте, установлены ли они.


0

Вы также можете прочитать возвращаемое значение $?из Yum. Должно быть 0, если все работает или положительно, в зависимости от того, с какими проблемами столкнулся yum. Это хороший способ, если вы хотите предпринять другие действия, если что-то не получается.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.