1. 系统概述

alternatives(Debian/Ubuntu 称为 update-alternatives,RHEL/CentOS/Fedora 直接称为 alternatives)是 Linux 系统中用于管理同一软件多版本共存的机制。

核心原理

通过维护一组符号链接(symlinks),指向由管理员配置的候选版本。系统根据优先级自动或手动选择默认版本。

适用场景

场景

示例

多版本 Java

OpenJDK 8/11/17/21

多版本编译器

GCC 不同版本

编辑器选择

vi/vim/nano/ed

桌面环境

x-window-manager

文档查看器

x-www-browser


2. 命令差异对照

发行版

命令名称

包管理器

Debian/Ubuntu

update-alternatives

dpkg/apt

RHEL/CentOS/Fedora/Rocky

alternatives

rpm/yum/dnf

openSUSE

update-alternatives

rpm/zypper

注意:以下示例统一使用 update-alternatives,RHEL 系用户请将命令替换为 alternatives(去掉 update- 前缀)。


3. 完整命令参考

3.1 安装与注册

添加新的替代项
update-alternatives --install <链接路径> <名称> <实际路径> <优先级>

参数说明

  • <链接路径>:系统命令的公共路径(如 /usr/bin/java
  • <名称>:替代组的标识名称(如 java
  • <实际路径>:该版本的真实可执行文件路径
  • <优先级>:数字越大,自动模式下优先级越高

Java 示例

# 安装 OpenJDK 11
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111

# 安装 OpenJDK 17(更高优先级)
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-17-openjdk-amd64/bin/java 1717

# 同时注册 javac
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac 1717

3.2 查询与显示

显示特定替代组的详细信息
update-alternatives --display <名称>

示例输出

$ update-alternatives --display java
java - auto mode
  link best version is /usr/lib/jvm/java-17-openjdk-amd64/bin/java
  link currently points to /usr/lib/jvm/java-17-openjdk-amd64/bin/java
  link java is /usr/bin/java
/usr/lib/jvm/java-11-openjdk-amd64/bin/java - priority 1111
/usr/lib/jvm/java-17-openjdk-amd64/bin/java - priority 1717
查询替代组配置
update-alternatives --query <名称>
列出所有替代组
update-alternatives --get-selections
列出特定名称的所有候选
update-alternatives --list <名称>

3.3 配置与切换

交互式选择默认版本(最常用)
sudo update-alternatives --config <名称>

交互示例

$ sudo update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                         Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1717      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java   1111      manual mode
  2            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1717      manual mode

Press <enter> to keep the current choice[*], or type selection number: 1
直接设置默认版本(非交互式)
sudo update-alternatives --set <名称> <实际路径>

示例

sudo update-alternatives --set java /usr/lib/jvm/java-11-openjdk-amd64/bin/java
切换为自动模式(按优先级自动选择)
sudo update-alternatives --auto <名称>
切换为手动模式(固定当前选择)
sudo update-alternatives --set <名称> <当前指向的路径>

3.4 删除与清理

移除特定候选版本
sudo update-alternatives --remove <名称> <实际路径>

示例

# 移除 Java 11
sudo update-alternatives --remove java /usr/lib/jvm/java-11-openjdk-amd64/bin/java

# 同时移除 javac
sudo update-alternatives --remove javac /usr/lib/jvm/java-11-openjdk-amd64/bin/javac
移除整个替代组(谨慎使用)
sudo update-alternatives --remove-all <名称>

4. 高级用法

4.1 管理从属链接(Slave Links)

某些软件有多个关联命令(如 javajavackeytool 等),可以一次性配置:

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-17-openjdk-amd64/bin/java 1717 \
  --slave /usr/bin/javac javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac \
  --slave /usr/bin/javadoc javadoc /usr/lib/jvm/java-17-openjdk-amd64/bin/javadoc \
  --slave /usr/bin/jar jar /usr/lib/jvm/java-17-openjdk-amd64/bin/jar

效果:切换 java 版本时,javacjavadocjar 会自动同步切换。

4.2 验证当前配置

# 查看当前 Java 版本
java -version

# 查看实际指向的路径
readlink -f $(which java)

# 或直接查看 alternatives 状态
update-alternatives --display java | grep "link currently"

4.3 批量查看所有配置

update-alternatives --get-selections

示例输出

editor           auto     /usr/bin/vim.basic
java             manual   /usr/lib/jvm/java-17-openjdk-amd64/bin/java
javac            manual   /usr/lib/jvm/java-17-openjdk-amd64/bin/javac
x-www-browser    auto     /usr/bin/firefox
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐