Rileva se il pacchetto homebrew è installato


104

Sto per scrivere uno script di shell per rilevare se nel sistema sono installati diversi pacchetti homebrew. C'è un modo per utilizzare un comando brew per ottenere ciò?

Ho provato a utilizzare il codice di uscita di brew install <formula> --dry-run. Ma questo costruisce il pacchetto se manca.


brew --cellar "$formula" >/dev/null 2>&1 --cellar formula: Display the location in the cellar where formula would be installed, without any sort of versioned directory as the last path. pagina man brew ; mi sarebbe piaciuto dare come risposta
166_MMX

if [ ! -x "$(command -v PKG_EXEC)" ]; then # package not installed fi
JBallin

Risposte:


164

Puoi usare

brew ls --versions myformula

per visualizzare le versioni installate della rispettiva formula. Se la formula non è installata, l'output sarà vuoto.

Quando usi una versione recente di homebrew, che puoi ottenere brew update, puoi semplicemente eseguire questo (grazie Slaven):

if brew ls --versions myformula > /dev/null; then
  # The package is installed
else
  # The package is not installed
fi

Detto questo, è probabilmente una buona idea controllare l'esistenza dello strumento e non solo controllare il rispettivo pacchetto homebrew (ad esempio cercando l'eseguibile in $PATH). Le persone tendono a installare gli strumenti in una quantità piuttosto ampia di modi nella pratica, con l'homebrew solo uno di questi.


6
Poiché github.com/Homebrew/brew/commit/… è sufficiente verificare il codice di uscita: se la formula non è installata, viene restituito false (1).
Slaven Rezic

Quindi, se corro if macchanger --help > /dev/null; then, controllerà se macchangerè installato?
anonimo

@KeeganKuhn Se è riuscito, allora macchangerè nella shell corrente $PATH. Se fallisce, non è disponibile nel PERCORSO o non è installato.
Holger Just

2
@Keegan Kuhn - Se vuoi davvero solo controllare se un'applicazione è sul PERCORSO (senza eseguirla), puoi usare which -s. L' -sopzione (silenziosa) è documentata come "-s Nessun output, restituisce solo 0 se viene trovato uno qualsiasi degli eseguibili o 1 se non viene trovato nessuno." L'uso corretto è qualcosa del tipowhich macchanger || echo "macchanger not on PATH"
Jeffrey Aguilera,

7

Che dire?

for pkg in macvim ngrep other needed packages; do
    if brew list -1 | grep -q "^${pkg}\$"; then
        echo "Package '$pkg' is installed"
    else
        echo "Package '$pkg' is not installed"
    fi
done

Le tue soluzioni non funzionano con una formula con versione come quella python@3installata (ed elencata) come python3.
Daniele Orlando

1
# install if we haven't installed any version
brew ls --versions $lib || brew install $lib
# install if we haven't installed latest version
brew outdated $lib || brew install $lib

1

Due righe più semplici: passaggio uno, assicurati che sia installato

$ realpath . || brew install coreutils

Questo stamperà il percorso reale della directory corrente, altrimenti lo installerà. E non fallirà nemmeno realpath non trovato.

Passaggio due, chiamalo nel tuo codice effettivo:

$ realpath ${someDir}

Questa è una soluzione semplice per uno strumento specifico. Non è una soluzione generica.
iltempo
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.