Linux alternatives / update-alternatives 使用教程
Linux系统通过update-alternatives/alternatives机制管理多版本软件共存,主要功能包括:1)通过符号链接实现版本切换;2)支持自动(按优先级)或手动选择默认版本;3)可管理关联命令组(如Java套件)。核心命令包括--install注册版本、--config交互切换、--display查询状态、--remove删除版本。该工具适用于管理Java、GCC等多版本环境,
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 |
|
dpkg/apt |
|
RHEL/CentOS/Fedora/Rocky |
|
rpm/yum/dnf |
|
openSUSE |
|
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)
某些软件有多个关联命令(如 java 和 javac、keytool 等),可以一次性配置:
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 版本时,javac、javadoc、jar 会自动同步切换。
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更多推荐

所有评论(0)