Як я можу визначити, чи встановлений пакет через yum у bash-скрипті?


75

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

Відповіді:


76

Я знайшов наступне у напівзв’язаному питанні 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які допомагають зробити функцію більш читаною / інтуїтивно зрозумілою, водночас повертаючи значення, які очікує баш (тобто 0 для істинного, 1 для помилкового).

Якщо ви просто перевіряєте наявність одного пакету у вашому сценарії, можливо, вам буде краще провести тестування yum list installedбезпосередньо, але (IMHO) функція полегшує розуміння того, що відбувається, а його синтаксис запам'ятовується набагато легше, ніж yumза всіма переадресаціями придушити його вихід.


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

1
Я думаю, що ваші ехо-твердження зворотні, ні? isInstalledповертає 1, якщо пакет встановлений; але 1 оцінюється як хибне в баші, тому "не встановлено" відлунне.
FGreg

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

5
OMG це 21 століття, чи не можуть вони мати належну можливість сказати, чи встановлений пакет, щоб у мене не було функцій запису чи одного вкладиша?
Суніл Д.

21

Не точно виконана умова питання "via yum", але швидше, ніж "yum -q list":

rpm -q <package_name>

який повертає точну назву можливо встановленої версії, а також код помилки "0", якщо встановлений, і "1", якщо ні.


+1, тому що це швидше
Фредді Фабрегас

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

9

Простіший oneliner:

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, якщо все спрацювало або було позитивним, залежно від того, з якими проблемами ви стикалися. Це хороший спосіб, якщо ви хочете вживати різних дій, якщо щось не вдається.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.