Wie kann ich feststellen, ob ein Paket über yum in einem Bash-Skript installiert ist?

75

Ich versuche, ein Skript zu schreiben, das Pakete installiert, aber wenn es zu einem späteren Zeitpunkt im Skript fehlschlägt, wird ein Rollback durchgeführt, unabhängig davon, was installiert wurde. Natürlich, wenn der Benutzer bereits zuvor ein Paket installiert hat, möchte ich es nicht unter ihnen deinstallieren. Wie kann mein Skript erkennen, ob ein Paket zuvor über yum installiert wurde?

Doktor J
quelle

Antworten:

76

Ich fand das folgende auf einer semi-verwandten StackOverflow-Frage ; Die Antwort, die ich brauchte, beantwortete die Frage dort nicht ganz (und wurde nicht als die richtige Antwort ausgewählt), also dachte ich, ich würde sie hier posten, damit andere sie leichter finden.

yum list installed PACKAGE_NAME

Dieser Befehl gibt einige für den Menschen lesbare Ausgaben zurück, gibt jedoch vor allem einen Beendigungsstatuscode zurück. 0 zeigt das Paket wird installiert, 1 zeigt das Paket nicht installiert ist (nicht überprüft , ob das Paket gültig ist, so yum list installed herpderp-beepbopboopwird wieder ein „1“ wie yum list installed traceroute, wenn Sie nicht trace installiert haben). Sie können anschließend "$?" für diesen Exit-Code.

Da die Ausgabe etwas kontraintuitiv ist, habe ich die "komprimierte" Version von @Chris Downs in einer Wrapper-Funktion verwendet, um die Ausgabe "logischer" zu gestalten (dh 1 = installiert 0 = nicht installiert):

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

Nutzung wäre

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

BEARBEITEN:

Ersetzte returnAnweisungen durch Aufrufe von trueund, falsedie die Funktion lesbarer / intuitiver machen, während die von bash erwarteten Werte zurückgegeben werden (dh 0 für wahr, 1 für falsch).

Wenn Sie nur nach einem Paket in Ihrem Skript suchen, ist es vielleicht besser, es direkt zu testen yum list installed, aber (IMHO) die Funktion macht es einfacher zu verstehen, was los ist, und die Syntax ist viel einfacher zu merken als yumbei allen Weiterleitungen seine Ausgabe zu unterdrücken.

Doktor J
quelle
2
Sie müssen den Wert von nicht manuell überprüfen, sondern $?wickeln den Befehl in eine Bedingung:if yum list installed "$package" >/dev/null 2>&1; then [...]
Chris Down
1
Ich denke, deine Echoaussagen sind umgekehrt, nein? isInstalledGibt 1 zurück, wenn das Paket installiert ist. aber 1 wird in bash als falsch gewertet, sodass "nicht installiert" wiedergegeben wird.
FGreg,
@FGreg good call ... Ich habe die returnAnweisungen durch Aufrufe von trueund ersetzt false, sodass die Funktion leicht lesbar ist und dennoch die erwartete Ausgabe-Bash zurückgibt.
Doktor J
5
Oh mein Gott, es ist das 21. Jahrhundert. Können sie nicht mit der richtigen Option feststellen, ob ein Paket installiert ist, also habe ich keine Schreibfunktionen oder keine Zeilen !?
Sunil D.
21

Die Voraussetzung der Frage "via yum" nicht genau zu erfüllen, aber schneller als "yum -q list" ist:

rpm -q <package_name>

Dies gibt den genauen Namen der möglicherweise installierten Version sowie den Fehlercode "0" (falls installiert) und "1" (falls nicht) zurück.

Gerald Schade
quelle
+1, weil das schneller ist
Freddie Fabregas
Auf jeden Fall schneller, denn rpmlokaler Paketmanager. yumist für den Umgang mit Paketen in Remote-Repositories
Sergiy Kolodyazhnyy
9

Einfacherer Oneliner:

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

Ein praktisches Skript für 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

Listen Sie in pckarr array die Pakete auf, die Sie installieren möchten, oder überprüfen Sie, ob diese installiert sind.

Ashish K Srivastava
quelle
0

Sie können auch den Rückgabewert $?von yum lesen . Sollte 0 sein, wenn alles geklappt hat oder positiv, je nachdem, auf welche Probleme Sie gestoßen sind. Dies ist eine gute Möglichkeit, wenn Sie bei einem Fehler verschiedene Aktionen ausführen möchten.

Fieber
quelle