在脚本执行初期增加路径检查机制,确保 `/usr/local/sbin` 和 `/opt/homebrew/sbin` 被正确包含在 PATH 中。此次变更还对代码结构进行了重新梳理,提高了脚本在不同终端环境下的兼容性。 主要变更: - 新增 `prepend_path_once` 函数,实现路径去重添加 - 确保 Homebrew 相关的 sbin 目录在执行前已进入环境变量 - 优化了代码块的排列顺序以提升可读性
Homebrew Upgrade Manager
brew-upgrade-manager.sh 是一个 macOS Homebrew 升级脚本,用于按固定流程更新 Homebrew、检查环境、升级 Formula 和 Cask,并清理旧版本与缓存。
仓库中同时提供 brew-upgrade-manager-bootstrap.sh。它是启动器:先从远端下载最新版 brew-upgrade-manager.sh 到临时文件,准备 sudo 凭据,执行后自动删除临时文件。适合在本机配置成 brewup 命令长期使用。
文件说明
| 文件 | 作用 |
|---|---|
brew-upgrade-manager.sh |
真正执行 Homebrew 升级流程的主脚本 |
brew-upgrade-manager-bootstrap.sh |
远程启动器,下载主脚本、执行、清理临时文件 |
功能
- 执行
brew update -v更新 Homebrew 仓库。 - 执行
brew doctor做健康检查;发现问题时给出警告,但不中断后续流程。 - 检查并安装
buo/cask-upgradetap,保留 GUI 应用升级相关兼容能力。 - 使用
brew upgrade --formula升级命令行工具。 - 使用
brew upgrade --cask --greedy --force强制升级 GUI 应用。 - 执行
brew cleanup --prune=all清理旧版本和缓存。 - 支持固定终端宽度,避免非交互环境下输出宽度异常。
- 启动器支持通过 macOS Keychain 保存并读取 sudo 密码,用于
sudo -A -v预刷新 sudo 凭据。
依赖
- macOS
- Homebrew
- Bash
curl- macOS Keychain 工具
/usr/bin/security,仅启动器需要
可先检查:
brew --version
curl --version
推荐用法:配置 brewup
把下面函数加入 ~/.zshrc:
brewup() {
curl -fsSL https://git.orionc.me/orion/script/raw/branch/main/homebrew/brew-upgrade-manager-bootstrap.sh | bash -s -- "$@"
}
重新加载 shell 配置:
source ~/.zshrc
之后直接运行:
brewup
传递参数时也可以正常转发给主脚本:
brewup --width 160
如果更偏好 alias,也可以使用:
alias brewup='curl -fsSL https://git.orionc.me/orion/script/raw/branch/main/homebrew/brew-upgrade-manager-bootstrap.sh | bash -s --'
函数版对参数转发更直观,推荐优先使用函数。
本地运行主脚本
如果已经 clone 了本仓库,也可以直接运行主脚本:
cd homebrew
chmod +x brew-upgrade-manager.sh
./brew-upgrade-manager.sh
指定固定终端宽度:
./brew-upgrade-manager.sh --width 130
./brew-upgrade-manager.sh --width=130
也可以通过环境变量指定:
HB_TERMINAL_WIDTH=130 ./brew-upgrade-manager.sh
优先级为:命令行 --width 高于 HB_TERMINAL_WIDTH。两者都不设置时,脚本会读取当前终端宽度;无法读取时默认使用 130。
启动器行为
brew-upgrade-manager-bootstrap.sh 会执行以下操作:
- 创建临时文件。
- 生成临时
SUDO_ASKPASS脚本。 - 从 macOS Keychain 读取 sudo 密码;首次使用时提示输入一次并保存到 Keychain。
- 执行
sudo -A -v刷新 sudo 凭据。 - 下载远端
brew-upgrade-manager.sh。 - 可选校验 SHA256。
- 使用
bash "$TEMP" "$@"执行主脚本并转发参数。 - 退出时删除临时脚本文件。
默认 Keychain service 名称为:
brewup-sudo-password
如需删除已保存的 sudo 密码:
security delete-generic-password -a "$USER" -s brewup-sudo-password
如需使用自定义 Keychain service:
BREWUP_KEYCHAIN_SERVICE=my-brewup-password brewup
SHA256 校验
启动器支持通过 BREWUP_SHA256 校验下载到的主脚本。先计算远端脚本当前哈希:
curl -fsSL https://git.orionc.me/orion/script/raw/branch/main/homebrew/brew-upgrade-manager.sh | shasum -a 256
运行时指定:
BREWUP_SHA256=<sha256> brewup
如果哈希不匹配,启动器会停止执行。
调试
查看启动器下载到的主脚本首行:
BREWUP_DEBUG=1 brewup
执行流程
主脚本执行顺序:
brew update -vbrew doctor- 检查
buo/cask-upgradetap brew upgrade --formulabrew upgrade --cask --greedy --forcebrew cleanup --prune=all
常见问题
首次运行为什么要输入 sudo 密码?
启动器会把 sudo 密码保存到当前用户的 macOS Keychain,后续通过临时 SUDO_ASKPASS 脚本读取,用于刷新 sudo 凭据。密码不会写入仓库,也不会写入主脚本。
Keychain 中的 sudo 密码不可用
通常是系统密码已变更,或 Keychain 条目内容不再正确。删除后重新运行即可:
security delete-generic-password -a "$USER" -s brewup-sudo-password
brewup
表格或输出宽度异常
指定固定宽度:
brewup --width 130
或:
HB_TERMINAL_WIDTH=130 brewup
brew tap buo/cask-upgrade 失败
通常是网络、Homebrew tap 或权限问题。先确认 Homebrew 可正常访问 GitHub 和对应 tap。
brew doctor 提示 warning
brew doctor 的 warning 不一定代表脚本失败。脚本会继续执行,并打印:
Warning: 'brew doctor' detected issues. Manual review and resolution are recommended.
常见 warning 处理方式:
-
Some installed casks are deprecated or disabled:说明某些 Cask 已废弃或被禁用,例如ayugram。可以自行寻找替代应用,或不再需要时卸载:brew uninstall --cask ayugram -
Homebrew's "sbin" was not found in your PATH:说明 shell 的 PATH 缺少 Homebrew 的 sbin 目录。Apple Silicon Mac 通常可加入:echo 'export PATH="/opt/homebrew/sbin:$PATH"' >> ~/.zshrc source ~/.zshrcIntel Mac 或
/usr/local安装的 Homebrew 可加入:echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.zshrc source ~/.zshrc
注意事项
- 脚本启用了
set -e和set -o pipefail,关键命令失败会终止流程。 brew upgrade --cask --greedy --force可能升级或替换已安装 GUI 应用,建议先保存重要工作。- 远程启动器属于“下载后执行”模式,只应从可信仓库使用。
- 在公司设备或受管 macOS 上运行前,先确认 Homebrew、Cask、Keychain 和 sudo 策略允许自动升级。