Wykryj, czy pakiet homebrew jest zainstalowany

104

Mam zamiar napisać skrypt powłoki, który wykryje, czy w systemie jest zainstalowanych kilka pakietów homebrew. Czy jest sposób na użycie polecenia parzenia, aby to osiągnąć?

Próbowałem użyć kodu zakończenia brew install <formula> --dry-run. Ale to buduje pakiet, jeśli go brakuje.

iltempo
źródło
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. brew man page ; chciałbym dać to jako odpowiedź
166_MMX
if [ ! -x "$(command -v PKG_EXEC)" ]; then # package not installed fi
JBallin,

Odpowiedzi:

165

Możesz użyć

brew ls --versions myformula

aby wyświetlić zainstalowane wersje odpowiedniej formuły. Jeśli formuła nie jest zainstalowana, dane wyjściowe będą puste.

Korzystając z najnowszych wersji homebrew, z których możesz skorzystać brew update, możesz po prostu uruchomić to (dzięki Slaven):

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

To powiedziawszy, prawdopodobnie dobrym pomysłem jest sprawdzenie w ogóle istnienia narzędzia, a nie tylko sprawdzenie odpowiedniego pakietu homebrew (np. Wyszukując plik wykonywalny w $PATH). W praktyce ludzie zazwyczaj instalują narzędzia na dość dużą liczbę sposobów, a homebrew jest tylko jednym z nich.

Holger Just
źródło
6
Ponieważ github.com/Homebrew/brew/commit/ ... wystarczy sprawdzić kod zakończenia: jeśli formuła nie jest zainstalowana, zwracana jest wartość false (1).
Slaven Rezic
Więc jeśli uruchomię if macchanger --help > /dev/null; then, czy to sprawdzi, czy macchangerjest zainstalowany?
anonimowy
@KeeganKuhn Jeśli to się udało, to macchangerjest w bieżącej powłoce $PATH. Jeśli się nie powiedzie, oznacza to, że nie jest dostępny w PATH lub nie jest zainstalowany.
Holger Tylko
2
@Keegan Kuhn - Jeśli naprawdę chcesz tylko sprawdzić, czy aplikacja znajduje się na PATH (bez jej uruchamiania), możesz użyć which -s. -sOpcja (cichy) jest udokumentowane jako „-s Bez wyjścia, po prostu zwraca 0 jeśli występują którekolwiek z plików wykonywalnych lub 1 jeśli nie odnajdzie.” Właściwe użycie to coś w rodzajuwhich macchanger || echo "macchanger not on PATH"
Jeffrey Aguilera
7

Co powiesz na?

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
źródło
Twoje rozwiązania nie działają z pewną wersjonowaną formułą, taką jak ta, python@3która jest zainstalowana (i wymieniona) jako 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
źródło
1

Najłatwiejsze dwuwarstwowe: Krok pierwszy, upewnij się, że jest zainstalowany

$ realpath . || brew install coreutils

Spowoduje to wydrukowanie rzeczywistej ścieżki bieżącego katalogu, jeśli nie, zainstaluje go. I nie zawiedzie nawet nie znalezionej ścieżki.

Krok drugi, nazwij to w swoim rzeczywistym kodzie:

$ realpath ${someDir}
ForeverYang
źródło
To łatwe rozwiązanie dla konkretnego narzędzia. To nie jest ogólne rozwiązanie.
iltempo