检测是否安装了自制程序包


104

我将要编写一个Shell脚本来检测系统中是否安装了几个自制程序包。有没有一种方法可以使用brew命令来实现?

我尝试使用的退出代码brew install <formula> --dry-run。但这将构建缺少的软件包。


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. 酿酒手册页 ; 会很乐意给出答案
166_MMX 2015年

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

Answers:


164

您可以使用

brew ls --versions myformula

输出相应公式的安装版本。如果未安装该公式,则输出将为空。

如果使用的是最新版本的自制软件,则brew update可以运行此代码(感谢Slaven):

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

就是说,最好根本检查一下该工具的存在,而不仅仅是检查各自的自制软件包(例如,通过在中搜索可执行文件$PATH)。人们倾向于在实践中以相当多的方式安装工具,而自制软件只是其中一种。


6
由于github.com/Homebrew/brew/commit/…足以检查退出代码:如果未安装公式,则返回false(1)。
Slaven Rezic

因此,如果我运行if macchanger --help > /dev/null; then,那会检查是否macchanger已安装吗?
匿名

@KeeganKuhn如果成功,则macchanger位于当前shell的$PATH。如果失败,则它在PATH中不可用或未安装。
Holger

2
@Keegan Kuhn-如果您真的只想检查应用程序是否在PATH上(不运行它),则可以使用which -s。该-s选项(静音)被记录为“-s无输出,只是返回0,如果任何可执行文件被发现,或1,如果没有找到。” 正确使用方法类似于which macchanger || echo "macchanger not on PATH"
Jeffrey Aguilera

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
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

最简单的两线:第一步,确保已安装

$ realpath . || brew install coreutils

这将打印出当前目录的真实路径,如果没有,则将其安装。而且即使没有找到realpath也不会失败。

第二步,在您的实际代码中调用它:

$ realpath ${someDir}

对于特定工具,这是一个简单的解决方案。这不是通用解决方案。
iltempo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.