Bash脚本检查指定版本Homebrew Formula是否已安装
精准检查Homebrew特定版本Formula是否已安装的解决方案
我之前配置开发环境的时候也遇到过一模一样的需求——要精准检查Homebrew里特定版本的Formula是否安装,毕竟有些老项目对依赖版本卡得特别死,比如你提到的openssl。下面给你分享几个轻量、可靠的实现方式,完全可以替代RubyGems里gem list -i的功能。
方法一:基于brew ls --versions的精确匹配
brew ls --versions <formula>会返回该Formula所有已安装的版本,我们可以用正则来精确匹配目标版本,避免出现“找1.1版本却误匹配到1.1.1”的情况。
先写一个可复用的检查函数:
# 检查指定Formula的指定版本是否已安装 brew_has_version() { local formula="$1" local target_version="$2" # 用正则确保版本号是独立的一项,避免部分匹配 brew ls --versions "$formula" | grep -qE "(^| )${target_version}( |$)" }
然后在脚本里这样用:
# 示例:检查并安装ruby 2.2.2 if ! brew_has_version ruby 2.2.2; then echo "正在安装ruby 2.2.2..." # 注意:Homebrew对旧版本的命名规范是「formula@主版本号」,比如ruby@2.2 brew install ruby@2.2 else echo "跳过安装:ruby 2.2.2已存在" fi # 示例:检查openssl 1.1.1t if ! brew_has_version openssl 1.1.1t; then echo "正在安装openssl 1.1.1t..." brew install openssl@1.1 # 1.1分支包含1.1.1系列所有版本 else echo "跳过安装:openssl 1.1.1t已存在" fi
为什么用这个正则?
(^| )确保版本号要么在开头,要么前面是空格;( |$)确保版本号要么后面是空格,要么在结尾。这样就能精准匹配单独的版本号,不会出现比如找1.1时误匹配1.1.1的情况。
方法二:基于brew info的版本检查
如果目标版本在Homebrew里是以formula@version的形式存在(这是旧版本的标准命名方式),可以直接用brew info来检查是否已安装:
brew_is_installed() { local formula_with_version="$1" # 重定向stderr到/dev/null,避免Formula不存在时输出错误信息 brew info "$formula_with_version" 2>/dev/null | grep -q "Installed:" }
使用示例:
if ! brew_is_installed ruby@2.2; then brew install ruby@2.2 else echo "ruby@2.2已安装" fi
这个方法的优点是直接对应Homebrew的版本命名规范,缺点是如果该版本的Formula已经从Homebrew Core仓库移除,brew info会报错,所以需要把错误输出丢弃。
注意事项
- Homebrew的版本命名规则:和RubyGems直接指定版本号不同,Homebrew的旧版本通常以
formula@主版本号的形式发布(比如ruby@2.7、openssl@1.1),安装时需要用这个名称,而不是brew install formula -v 版本号(-v在brew里是显示详细日志,不是指定版本)。 - 旧版本Formula可能被移除:如果某个版本已经从Core仓库删除,你需要找到该版本对应的Formula历史commit,直接安装原始文件,比如:
(brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/abc123/Formula/ruby.rbabc123替换为对应版本的commit哈希)
内容的提问来源于stack exchange,提问作者Steven Verheyen
相关产品推荐
相关产品推荐

