Определить, установлен ли пакет homebrew

105

Я собираюсь написать сценарий оболочки, чтобы определить, установлено ли в системе несколько пакетов homebrew. Есть ли способ использовать для этого команду brew?

Я пробовал использовать код выхода brew install <formula> --dry-run. Но это создает пакет, если он отсутствует.

iltempo
источник
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-страницу ; хотел бы дать это в качестве ответа
166_MMX
if [ ! -x "$(command -v PKG_EXEC)" ]; then # package not installed fi
JBallin

Ответы:

166

Ты можешь использовать

brew ls --versions myformula

для вывода установленных версий соответствующей формулы. Если формула не установлена, вывод будет пустым.

При использовании последних версий homebrew, с которыми вы можете brew updateработать, вы можете просто запустить это (спасибо Slaven):

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

Тем не менее, вероятно, было бы неплохо проверить наличие инструмента вообще, а не просто проверять соответствующий пакет homebrew (например, путем поиска исполняемого файла в $PATH). На практике люди склонны устанавливать инструменты довольно большим количеством способов, и homebrew является лишь одним из них.

Хольгер Джаст
источник
6
Так как github.com/Homebrew/brew/commit/… достаточно проверить код выхода: если формула не установлена, возвращается false (1).
Slaven Rezic
Итак, если я сбегу if macchanger --help > /dev/null; then, будет ли это проверять, macchangerустановлено ли?
анонимный
@KeeganKuhn Если это удалось, то macchangerнаходится в текущей оболочке $PATH. В случае сбоя он либо недоступен в PATH, либо не установлен.
Holger Just
2
@Keegan Kuhn - Если вы действительно хотите просто проверить, находится ли приложение в PATH (без его запуска), вы можете использовать which -s. Параметр -s(без вывода сообщений) задокументирован как «-s Нет вывода, просто вернуть 0, если какой-либо из исполняемых файлов найден, или 1, если ничего не найдено». Правильное использование - это что-то вродеwhich macchanger || echo "macchanger not on PATH"
Джеффри Агилера
7

Что о?

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
Йоханнес Вайс
источник
Ваши решения не работают с некоторыми версиями формул, например, python@3которая установлена ​​(и указана) как python3.
Даниэле Орландо
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

Самые простые двухстрочные: Шаг первый, убедитесь, что он установлен

$ realpath . || brew install coreutils

Это распечатает реальный путь к текущему каталогу, если нет, то он установит его. И это не сработает, даже если реальный путь не найден.

Шаг второй, вызовите его в своем реальном коде:

$ realpath ${someDir}
ForeverYang
источник
Это простое решение для конкретного инструмента. Это не универсальное решение.
iltempo,