alternatives命令用于管理linux系统中多版本软件的符号链接,解决手动切换版本的麻烦;2. 核心操作包括:使用--install注册新版本并设置优先级,--config交互式切换版本,--display查看当前配置状态;3. 工作原理是通过/usr/bin下的主链接指向/etc/alternatives中的次级链接,再指向实际程序路径;4. 常见问题如版本未更新可清除shell缓存(hash -r),未注册版本需先执行--install,移除版本用--remove,手动选择后进入手动模式避免自动切换。该工具通过标准化机制实现多版本软件的灵活、可靠管理,最终确保系统级的版本切换准确生效。

管理多版本软件包,比如系统里同时装了JDK 8和JDK 11,或者Python 2和Python 3,
alternatives命令就是Linux系统里一个非常趁手的工具。它本质上就是帮你管理这些不同版本软件的符号链接,让你可以非常方便、规范地在它们之间切换,避免了手动创建和维护一大堆软链接的麻烦。
解决方案
alternatives命令提供了一种标准化的方式来管理系统中同名但不同版本的命令或文件。它通过维护一个主符号链接(通常在
/usr/bin或
/bin下),指向
/etc/alternatives目录下的一个次级符号链接,而这个次级链接最终指向实际的程序路径。这种设计让版本切换变得非常灵活。
要使用
alternatives,核心操作主要有几个:
-
注册一个新版本(
--install
): 当你安装了一个新版本的软件,想让alternatives
管理它时,需要用--install
。alternatives --install
- : 这是你希望在
/usr/bin
或/bin
下创建的主符号链接,比如/usr/bin/java
。
: 这是alternatives
内部用来识别这个软件的名称,比如java
。
: 这是实际的程序路径,比如/usr/lib/jvm/java-11-openjdk-amd64/bin/java
。
: 一个整数,数字越大,优先级越高。在自动模式下,系统会选择优先级最高的版本。
示例: 假设你安装了OpenJDK 8和OpenJDK 11,想让
alternatives
管理java
命令:sudo alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-openjdk-amd64/bin/java 80 sudo alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk-amd64/bin/java 110
这里,
java
是这个"替代品组"的名字,80
和110
是它们的优先级。 - : 这是你希望在
-
切换版本(
--config
): 当你想在不同的版本之间切换时,使用--config
。alternatives --config
它会列出所有注册在该name
下的版本,让你选择一个。 示例:sudo alternatives --config java
执行后,你会看到一个列表,类似这样:
There are 2 choices for the alternative java (providing /usr/bin/java). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 110 auto mode 1 /usr/lib/jvm/java-8-openjdk-amd64/bin/java 80 manual mode Press
to keep the current choice[*], or type selection number: 输入对应的数字就可以切换了。
-
查看当前状态(
--display
): 想知道某个命令当前指向哪个版本,或者alternatives
管理了哪些版本,用--display
。alternatives --display
示例:alternatives --display java
这会显示
java
这个替代品组的详细信息,包括当前链接指向哪里,有哪些可用的替代品,以及它们的优先级。
为什么我们需要 alternatives
?多版本共存的痛点与解决方案
说实话,在没有
alternatives之前,管理系统里的多版本软件简直是个噩梦。想想看,你可能需要JDK 8来跑一些老项目,但新项目又要求JDK 11,甚至JDK 17。或者,你的Python环境,有些脚本依赖Python 2,大部分新开发都用Python 3。手动去改
PATH环境变量,或者在
/usr/bin下创建一堆软链接,然后每次切换都得小心翼翼地删掉旧的,再创建新的,这不光效率低下,还特别容易出错。我记得有次就因为手滑,把一个重要的系统命令链接给搞坏了,结果一堆东西都跑不起来,那感觉真是崩溃。
alternatives就是来解决这个痛点的。它提供了一个统一、规范的框架。你只需要告诉它:“嘿,我有好几个
java程序,它们都在这儿,这是它们的优先级。”然后,当你需要切换时,
alternatives --config java一下,选个数字,完事儿。它帮你处理了底层的符号链接更新,而且是系统级的,对所有用户都生效。这种标准化,让多版本共存不再是系统管理的负担,反而成了一种灵活配置的优势。它就像一个智能的交通指挥员,让不同版本的软件在你的系统里各行其道,需要时又能迅速切换车道。
睿拓智能网站系统-睿拓企业网站系统1.2免费版软件大小:6M运行环境:asp+access本版本是永州睿拓信息企业网站管理系统包括了企业网站常用的各种功能,带完整的后台管理系统,本程序无任何功能限制下载即可使用,具体功能如下。1.网站首页2.会员注册3.新闻文章模块4.产品图片展示模块5.人才招聘模块6.在线留言模块7.问卷调查模块8.联系我们模块9.在线QQ客服系统10.网站流量统计系统11.后
alternatives
命令的核心操作:安装、配置与查看
理解
alternatives的核心,就是掌握
--install、
--config和
--display这三个参数。它们构成了管理软件版本的完整生命周期。
--install是你把一个新软件版本“介绍”给
alternatives的入口。它的参数顺序很重要:
--install <主链接路径> <替代品组名> <实际程序路径> <优先级>。那个
<主链接路径>通常是
/usr/bin/java或者
/usr/bin/python这样的,是用户实际会执行的命令。
<替代品组名>则是
alternatives内部用来归类和管理这些不同版本的“名字”,比如
java、
python、
gcc。
<实际程序路径>就是你安装的那个具体版本的可执行文件在哪儿。而
<优先级>是个挺有意思的设定,它决定了在“自动模式”下,哪个版本会被默认选中。数字越大,优先级越高。比如你给JDK 11设110,给JDK 8设80,那么在自动模式下,系统就会默认用JDK 11。这对于那些你希望大多数时候都用最新版本的场景非常方便。
--config则是日常使用中最常用的。当你需要从JDK 11切换回JDK 8,或者从Python 3.9切换到Python 3.11时,就用它。它会弹出一个交互式菜单,你输入对应的数字就能完成切换。这个操作会把当前替代品组从“自动模式”切换到“手动模式”,意味着系统不再根据优先级自动选择,而是按照你手动选择的来。
最后,
--display就像一个诊断工具。当你搞不清楚当前
java命令到底指向哪个版本,或者想看看
alternatives到底管理了
java的哪些版本时,
alternatives --display java就能给你答案。它会告诉你当前是自动模式还是手动模式,以及所有注册的路径和它们的优先级。这对于排查问题或者仅仅是确认当前环境非常有用。
深入理解 alternatives
的工作原理与常见问题排查
alternatives的工作原理其实并不复杂,但理解它能帮你更好地排查问题。它并不是直接修改你的
PATH环境变量(那是shell的事情),而是通过创建和管理
/etc/alternatives/目录下的符号链接,以及最终指向这些链接的
/usr/bin(或其他标准路径)下的主链接。
举个例子,当你配置
java时,
alternatives会做几件事:
- 在
/etc/alternatives/
目录下创建一个名为java
的符号链接,这个链接会指向你选择的那个具体版本的java
可执行文件(比如/usr/lib/jvm/java-11-openjdk-amd64/bin/java
)。 - 确保
/usr/bin/java
这个主链接指向/etc/alternatives/java
。
所以,当你执行
java -version时,系统实际上是找到
/usr/bin/java,然后发现它指向
/etc/alternatives/java,再发现
/etc/alternatives/java指向
/usr/lib/jvm/java-11-openjdk-amd64/bin/java,最终执行的就是这个路径下的
java。
常见问题排查:
“切换了版本,但
java -version
显示还是旧的?” 这通常不是alternatives
的问题,而是你的shell环境问题。如果你在切换版本前已经打开了一个终端,这个终端可能已经缓存了旧的java
路径。简单的解决方法是:关闭当前终端,重新打开一个;或者在当前终端里执行hash -r
来清除shell的命令缓存。“执行
alternatives --config
,提示No alternatives for
?” 这意味着你还没有用--install
把任何版本注册到这个
下。你需要先用alternatives --install
把你的软件版本加进去。“想移除一个不再需要的版本,怎么做?” 可以使用
alternatives --remove
。 比如:sudo alternatives --remove java /usr/lib/jvm/java-8-openjdk-amd64/bin/java
。 注意,移除后,如果这个版本是当前活动的,alternatives
会自动切换到下一个优先级最高的版本(如果存在的话)。“
alternatives
是自动模式,但我希望它一直用某个特定版本,不想被优先级覆盖。” 当你使用alternatives --config
手动选择一个版本后,该替代品组就会进入“手动模式”。这意味着即使有更高优先级的版本被安装,系统也不会自动切换过去,除非你再次手动选择或将其设回自动模式(通常选择列表中的0
选项)。
理解这些,你会发现
alternatives这个工具,虽然初看起来有点绕,但一旦掌握,它在管理多版本软件时的作用,简直是系统管理员和开发者的福音。它让复杂的版本管理变得井井有条,避免了不必要的混乱和错误。









