Détecter si le package homebrew est installé

104

Je suis sur le point d'écrire un script shell pour détecter si plusieurs packages homebrew sont installés dans le système. Existe-t-il un moyen d'utiliser une commande d'infusion pour y parvenir?

J'ai essayé d'utiliser le code de sortie de brew install <formula> --dry-run. Mais cela construit le package s'il manque.

iltempo
la source
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. page de manuel brew ; aurait aimé y répondre
166_MMX
if [ ! -x "$(command -v PKG_EXEC)" ]; then # package not installed fi
JBallin

Réponses:

165

Vous pouvez utiliser

brew ls --versions myformula

pour afficher les versions installées de la formule respective. Si la formule n'est pas installée, la sortie sera vide.

Lorsque vous utilisez une version récente de homebrew, que vous pouvez utiliser brew update, vous pouvez simplement l'exécuter (merci Slaven):

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

Cela dit, c'est probablement une bonne idée de vérifier l'existence de l'outil et pas seulement de vérifier le paquet homebrew respectif (par exemple en recherchant l'exécutable dans le $PATH). Les gens ont tendance à installer des outils de nombreuses manières dans la pratique, l'homebrew n'étant que l'une d'entre elles.

Holger Just
la source
6
Depuis github.com/Homebrew/brew/commit/... il suffit de vérifier le code de sortie: si la formule n'est pas installée, alors false (1) est renvoyé.
Slaven Rezic
Donc, si je cours if macchanger --help > /dev/null; then, est-ce que cela vérifiera si macchangerest installé?
anonyme
@KeeganKuhn Si cela a réussi, alors macchangerest dans le shell actuel $PATH. En cas d'échec, il n'est pas disponible dans le PATH ou n'est pas installé.
Holger seulement
2
@Keegan Kuhn - Si vous voulez vraiment simplement vérifier si une application est sur le PATH (sans l'exécuter), vous pouvez utiliser which -s. L' -soption (silent) est documentée comme "-s Pas de sortie, retourne simplement 0 si l'un des exécutables est trouvé, ou 1 si aucun n'est trouvé." L' utilisation correcte est quelque chose commewhich macchanger || echo "macchanger not on PATH"
Jeffrey Aguilera
7

Qu'en est-il de?

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
Johannes Weiss
la source
Vos solutions ne fonctionnent pas avec une formule versionnée comme celle python@3qui est installée (et répertoriée) sous 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
timotheecour
la source
1

Les deux doublures les plus faciles: Première étape, assurez-vous qu'il est installé

$ realpath . || brew install coreutils

Cela affichera le chemin réel du répertoire actuel, sinon, il l'installera. Et il n'échouera pas même realpath introuvable.

Deuxième étape, appelez-le dans votre code réel:

$ realpath ${someDir}
ForeverYang
la source
C'est une solution simple pour un outil spécifique. Ce n'est pas une solution générique.
iltempo