Detectar se o pacote homebrew está instalado

104

Estou prestes a escrever um script de shell para detectar se vários pacotes homebrew estão instalados no sistema. Existe uma maneira de usar um comando brew para fazer isso?

Tentei usar o código de saída de brew install <formula> --dry-run. Mas isso cria o pacote se estiver faltando.

iltempo
fonte
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. página man do brew ; teria adorado dar isso como uma resposta
166_MMX
if [ ! -x "$(command -v PKG_EXEC)" ]; then # package not installed fi
JBallin

Respostas:

164

Você pode usar

brew ls --versions myformula

para produzir as versões instaladas da respectiva fórmula. Se a fórmula não estiver instalada, a saída ficará vazia.

Ao usar uma versão recente do homebrew, que você pode usar brew update, você pode simplesmente executar isto (obrigado, Slaven):

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

Dito isso, provavelmente é uma boa ideia verificar a existência da ferramenta e não apenas verificar o respectivo pacote homebrew (por exemplo, pesquisando o executável no $PATH). Na prática, as pessoas tendem a instalar ferramentas de várias maneiras, sendo o homebrew apenas uma delas.

Holger Just
fonte
6
Como github.com/Homebrew/brew/commit/… é suficiente verificar o código de saída: se a fórmula não estiver instalada, false (1) será retornado.
Slaven Rezic,
Portanto, se eu executar if macchanger --help > /dev/null; then, isso verificará se macchangerestá instalado?
anônimo
@KeeganKuhn Se obtiver sucesso, então macchangerestá no shell atual $PATH. Se falhar, significa que não está disponível no PATH ou não foi instalado.
Holger apenas
2
@Keegan Kuhn - Se você realmente deseja apenas verificar se um aplicativo está no PATH (sem executá-lo), você pode usar which -s. A -sopção (silencioso) é documentada como "-s Sem saída, apenas retorna 0 se algum dos executáveis ​​for encontrado, ou 1 se nenhum for encontrado." O uso adequado é algo comowhich macchanger || echo "macchanger not on PATH"
Jeffrey Aguilera
7

A respeito?

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
fonte
Suas soluções não funcionam com alguma fórmula com versão, como a python@3que está instalada (e listada) como 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
fonte
1

Dois liners mais fáceis: Etapa um, certifique-se de que esteja instalado

$ realpath . || brew install coreutils

Isso imprimirá o caminho real do diretório atual, se não, ele o instalará. E não falhará mesmo o caminho real não encontrado.

Etapa dois, chame-o em seu código real:

$ realpath ${someDir}
ForeverYang
fonte
Esta é uma solução fácil para uma ferramenta específica. Não é uma solução genérica.
iltempo