Jak mogę sprawdzić, czy pakiet jest instalowany przez yum w skrypcie bash?

75

Próbuję napisać skrypt, który instaluje pakiety, ale jeśli w dowolnym momencie nie powiedzie się, skrypt wycofuje wszystko, co zainstalował. Oczywiście, jeśli użytkownik już wcześniej zainstalował pakiet, nie chcę go odinstalowywać spod niego. Jak mój skrypt może stwierdzić, czy pakiet został wcześniej zainstalowany za pomocą yum?

Doktor J
źródło

Odpowiedzi:

76

Znalazłem następujące na częściowo powiązane pytanie StackOverflow ; odpowiedź, której potrzebowałem, nie do końca odpowiedziała na pytanie (i nie została wybrana jako poprawna odpowiedź), więc pomyślałem, że opublikuję ją tutaj, aby inni mogli łatwiej znaleźć.

yum list installed PACKAGE_NAME

To polecenie zwraca dane wyjściowe czytelne dla człowieka, ale co ważniejsze zwraca kod statusu wyjścia; 0 oznacza, że ​​pakiet jest zainstalowany, 1 oznacza, że ​​pakiet nie został zainstalowany (nie sprawdza, czy pakiet jest prawidłowy, więc yum list installed herpderp-beepbopboopzwróci „1” tak samo, jak w yum list installed tracerouteprzypadku braku traceroute). Następnie możesz sprawdzić „$?” dla tego kodu wyjścia.

Ponieważ dane wyjściowe są nieco sprzeczne z intuicją, użyłem „skróconej” wersji @Chris Downs poniżej w funkcji otoki, aby uczynić wydruk bardziej „logicznym” (tj. 1 = zainstalowany 0 = niezainstalowany):

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

użycie byłoby

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

EDYTOWAĆ:

Zamienione returninstrukcje z wywołaniami do truei falsektóre pomagają uczynić funkcję bardziej czytelną / intuicyjną, zwracając wartości oczekiwane przez bash (tj. 0 dla wartości true, 1 dla wartości false).

Jeśli sprawdzasz tylko jeden pakiet w skrypcie, być może lepiej jest przetestować yum list installedbezpośrednio, ale (IMHO) funkcja ułatwia zrozumienie, co się dzieje, a jej składnia jest znacznie łatwiejsza do zapamiętania niż yumprzy wszystkich przekierowaniach tłumić jego moc wyjściową.

Doktor J
źródło
2
Nie musisz ręcznie sprawdzać wartości $?, po prostu zawiń polecenie warunkowo:if yum list installed "$package" >/dev/null 2>&1; then [...]
Chris Down,
1
Myślę, że twoje wypowiedzi echa są odwrócone, nie? isInstalledzwraca 1, jeśli pakiet jest zainstalowany; ale 1 jest oceniane na false w bash, więc echo „niezainstalowany”.
FGreg
@FGreg dobre wywołanie ... Zastąpiłem returninstrukcje wywołaniami do truei false, więc funkcja jest łatwa do odczytania, ale zwraca oczekiwane bash wyjściowy.
Doktor J
5
OMG to XXI wiek, czy nie mogą mieć właściwej opcji, aby stwierdzić, czy pakiet jest zainstalowany, więc nie mam funkcji zapisu ani jednego linera !?
Sunil D.
21

Nie do końca spełnione jest pytanie „via yum”, ale szybsze niż „lista yum -q”:

rpm -q <package_name>

która zwraca dokładną nazwę ewentualnie zainstalowanej wersji, a także kod błędu „0”, jeśli jest zainstalowany, i „1”, jeśli nie.

Gerald Schade
źródło
+1, ponieważ jest to szybsze
Freddie Fabregas,
Zdecydowanie szybszy, ponieważ rpmjest lokalnym menedżerem pakietów. yumjest do obsługi paczek w zdalnych repozytoriach
Sergiy Kolodyazhnyy
9

Prostszy oneliner:

yum -q list installed packageX &>/dev/null && echo "Installed" || echo "Not installed"
Zlemini
źródło
0

Przydatny skrypt dla mniam:

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

W tablicy pckarr wypisz te pakiety, które chcesz zainstalować lub sprawdź, czy są zainstalowane.

Ashish K Srivastava
źródło
0

Możesz także odczytać wartość zwracaną $?z yum. Powinno wynosić 0, jeśli wszystko działało lub było pozytywne, w zależności od tego, jakie problemy napotkałeś. To dobry sposób, jeśli chcesz podjąć inne działania, jeśli coś zawiedzie.

Gorączka
źródło