Come posso sapere se un pacchetto è installato tramite yum in uno script bash?


76

Sto provando a scrivere uno script che installa i pacchetti, ma se in un secondo momento fallisce lo script ripristina qualsiasi cosa sia installata. Ovviamente se l'utente ha già installato un pacchetto in precedenza, non voglio disinstallarlo da sotto di esso. Come può il mio script dire se un pacchetto è stato precedentemente installato tramite yum?

Risposte:


77

Ho trovato quanto segue su una domanda StackOverflow semi-correlata ; la risposta di cui avevo bisogno in realtà non rispondeva abbastanza alla domanda lì (e non era stata selezionata come risposta corretta), quindi ho pensato di pubblicarla qui perché altri lo trovassero più facile.

yum list installed PACKAGE_NAME

Questo comando restituisce un output leggibile dall'uomo, ma soprattutto restituisce un codice di stato di uscita; 0 indica che il pacchetto è installato, 1 indica che il pacchetto non è installato (non verifica se il pacchetto è valido, quindi yum list installed herpderp-beepbopbooprestituirà un "1" proprio come yum list installed traceroutefarebbe se non hai installato traceroute). Successivamente puoi controllare "$?" per questo codice di uscita.

Poiché l'output è in qualche modo contro-intuitivo, ho usato la versione "condensata" di @Chris Downs di seguito in una funzione wrapper per rendere l'output più "logico" (ovvero 1 = installato 0 = non installato):

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

l'uso sarebbe

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

MODIFICARE:

Sostituite le returnistruzioni con le chiamate a truee falseche aiutano a rendere la funzione più leggibile / intuitiva, mentre restituiscono i valori previsti da bash (ovvero 0 per vero, 1 per falso).

Se stai solo cercando un pacchetto nel tuo script, potresti semplicemente fare un test migliore yum list installeddirettamente, ma (IMHO) la funzione rende più facile capire cosa sta succedendo e la sua sintassi è molto più facile da ricordare rispetto yuma tutti i reindirizzamenti per sopprimerne l'output.


2
Non è necessario controllare manualmente il valore di $?, basta avvolgere il comando in un condizionale:if yum list installed "$package" >/dev/null 2>&1; then [...]
Chris Down

1
Penso che le tue dichiarazioni di eco siano invertite, no? isInstalledrestituisce 1 se il pacchetto è installato; ma 1 viene valutato come falso in bash, quindi viene ripetuto "non installato".
Freg

@FGreg good call ... Ho sostituito le returnistruzioni con le chiamate a truee false, quindi la funzione è facilmente leggibile ma restituisce l'output previsto da bash.
Doktor J,

5
OMG è il 21 ° secolo, non possono avere un'opzione adeguata per dire se un pacchetto è installato, quindi non ho funzioni di scrittura o una linea !?
Sunil D.

21

Non soddisfa esattamente il prerequisito della domanda "via yum" ma più velocemente di "yum -q list" è:

rpm -q <package_name>

che restituisce il nome esatto della versione eventualmente installata, nonché il codice di errore "0" se installato e "1" in caso contrario.


+1 perché è più veloce
Freddie Fabregas,

Decisamente più veloce, perché rpmè gestore di pacchetti locale. yumè per gestire i pacchetti in repository remoti
Sergiy Kolodyazhnyy il

9

Oneliner più semplice:

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

0

Uno script utile per 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

Nell'array pckarr, elenca i pacchetti che desideri installare o controlla se è installato.


0

Puoi anche leggere il valore di ritorno $?da yum. Dovrebbe essere 0 se tutto ha funzionato o positivo a seconda del tipo di problemi che si sono verificati. Questo è un buon modo se vuoi intraprendere azioni diverse se qualcosa fallisce.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.