检测是否安装了Homebrew软件包

121

我即将编写一个shell脚本,检测系统中是否安装了几个homebrew包。 有没有一种方法可以使用brew命令来实现这个目的?

我尝试使用brew install <formula> --dry-run的退出代码。但是,如果缺少软件包,则会构建软件包。


1
brew --cellar "$formula" >/dev/null 2>&1 --cellar formula: 显示公共目录中安装公式的位置,最后一个路径不包含任何版本信息。 brew man page; 很高兴能为您提供这个答案。 - 166_MMX
`if [ ! -x "$(command -v PKG_EXEC)" ]; then

package not installed

fi`
- JBallin
5个回答

189

您可以使用

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只是其中之一。


7
自从https://github.com/Homebrew/brew/commit/db478fb7b2d8047403b71208af73b400bcf7a3e2之后,只需检查退出代码即可:如果配方未安装,则返回false(1)。 - Slaven Rezic
如果我运行 if macchanger --help > /dev/null; then,那么这会检查 macchanger 是否已安装? - anonymous
如果成功了,那么 macchanger 就在当前 shell 的 $PATH 中。如果失败了,那么它要么不在 PATH 中,要么没有安装。 - Holger Just
2
@Keegan Kuhn - 如果您只是想检查应用程序是否在PATH中(而不运行它),则可以使用which -s-s选项(静默)的文档说明为“-s 无输出,如果找到任何可执行文件,则返回0,如果未找到,则返回1。” 正确的用法类似于which macchanger || echo“macchanger未在PATH上” - Jeffrey Aguilera
如果您使用了 --cask 选项安装了某个软件包,则可以在命令末尾添加 --cask,并运行类似于 brew ls --versions adoptopenjdk11 --cask > /dev/null 的命令。 - Seiwon Park

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

我会选择这个。 - saviour123

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

你的解决方案无法与某些版本化公式(例如已安装(并列出)为“python3”的“python@3”)一起使用。 - Daniele Orlando

1

对于脚本和自动化使用,我发现brew bundle --help非常方便。

如果你不想使用真正的bundle文件,在脚本中使用这个代码片段也是可以的:

brew bundle -v --file=- <<-EOF
brew "mc"
brew "ffmpeg"
brew "wget"
cask "cpuinfo"
cask "intel-power-gadget"
cask "unetbootin"
cask "vlc"
EOF

好处在于,它会自动检测软件包是否安装,如果过时,则仅会在此时进行安装。

如果您不想更新,请添加一个标志--no-upgrade。我已经加了一个-v以获取更多详细信息,但您可以跳过它,甚至使用-q以获得更加安静的运行。


1

最简单的两步操作: 第一步,确保已经安装

$ realpath . || brew install coreutils

这将打印出当前目录的真实路径,如果没有,则会安装它。 即使找不到真实路径,它也不会失败。
第二步,在您的实际代码中调用它:
$ realpath ${someDir}

这是一个特定工具的简单解决方案。它不是通用解决方案。 - iltempo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接