update-alternatives:在 Linux 中管理同一命令的多个实现

理解 Debian/Ubuntu 的 alternatives 链接组,安全切换 editor、java 等多版本命令。

适用环境:Ubuntu 22.04 LTS / Debian 系。update-alternatives 管理的是系统级符号链接,不等同于语言版本管理器或 PATH 顺序。

同一个命令名可能有多种实现,例如 editorjavacc。Debian 系统用 alternatives 链接组决定默认目标,避免用户直接手改 /usr/bin 下的链接。

查看与交互选择

1
2
update-alternatives --display editor
sudo update-alternatives --config editor

第一条会显示当前链接、可选项和优先级;第二条提供编号选择。切换前先确认候选程序来自可信软件包,并在切换后核对版本:

1
2
command -v editor
readlink -f "$(command -v editor)"

创建自定义链接组时要非常具体

只有当软件本身没有注册 alternatives 且确有系统级需求时,才使用 --install。下面是占位示例,路径、名称、优先级都必须换成实际值:

1
2
sudo update-alternatives --install /usr/local/bin/example-tool example-tool /opt/example-v2/bin/example-tool 20
sudo update-alternatives --config example-tool

不要用 alternatives 直接管理 pythonpip、Node.js、CMake 等开发工具的全部生态。它们通常还牵涉虚拟环境、包管理器、IDE 与项目级版本要求;更适合使用 venv、nvm、容器或项目工具链。

取消手工加入的候选项

1
sudo update-alternatives --remove example-tool /opt/example-v2/bin/example-tool

移除前先切换到另一个有效候选项。由 APT 安装的软件包应优先通过 APT 卸载,让软件包维护脚本处理对应 alternatives。

出处

本文将原始资料整理为“查看—切换—谨慎注册—移除”的可回退流程。