在ubuntu系统中,update-alternatives是专门维护系统命令链接符的工具,其可以对某个工具的多个软件版本进行管理,通过它可以很方便的设置系统默认使用哪个命令的哪个软件版本。

在命令行中直接输入update-alternatives --help命令,
[19:19:24]@~$ update-alternatives --help
Usage: update-alternatives [

Commands:
--install

[--slave <link> <name> <path>] ...
                       add a group of alternatives to the system.

--remove remove from the group alternative.
--remove-all remove group from the alternatives system.
--auto switch the master link to automatic mode.
--display display information about the group.
--query machine parseable version of --display .
--list display all targets of the group.
--get-selections list master alternative names and their status.
--set-selections read alternative status from standard input.
--config show alternatives for the group and ask the

                       user to select which one to use.

--set set as alternative for .
--all call --config on all alternatives.

is the symlink pointing to /etc/alternatives/.
(e.g. /usr/bin/pager)
is the master name for this link group.
(e.g. pager)
is the location of one of the alternative target files.
(e.g. /usr/bin/less)
is an integer; options with higher numbers have higher priority in
automatic mode.

Options:
--altdir change the alternatives directory.
--admindir change the administrative directory.
--log change the log file.
--force allow replacing files with alternative links.
--skip-auto skip prompt for alternatives correctly configured

                       in automatic mode (relevant for --config only)

--verbose verbose operation, more output.
--quiet quiet operation, minimal output.
--help show this help message.
--version show the version.
[19:19:28]@~$

其工作原理如下:系统路径下,/usr/bin/这个软链接,指向了/etc/alternatives/这个文件,其其实也是个软链接,指向了该命令的实际可执行文件;如下:

lrwxrwxrwx 1 root root 22 5月 6 2015 /usr/bin/java -> /etc/alternatives/java*

lrwxrwxrwx 1 root root 70 10月 28 14:11 /etc/alternatives/java -> /home/likewise-open/SPREADTRUM/hunter.ding/tools/jdk1.8.0_112/bin/java*
可见,通过两次软链接,我们可以定位到实际的java文件;后面我们针对这个软件版本的管理都是通过改变/etc/alternatives/ --> /实际可执行文件 的软链接来进行的。

来看一个例子,在上面的java可执行组中,修改一下java的版本:

[19:37:17]@~$ java -version
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
Java HotSpot(TM) Server VM (build 25.112-b15, mixed mode)
[19:37:20]@~$ sudo update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).

Selection Path Priority Status

  • 0 /home/likewise-open/SPREADTRUM/hunter.ding/tools/jdk1.8.0_112/bin/java 1062 auto mode
    1 /home/likewise-open/SPREADTRUM/hunter.ding/tools/jdk1.8.0_112/bin/java 1062 manual mode
    2 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1060 manual mode
    3 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 1061 manual mode

Press enter to keep the current choice[*], or type selection number: 2
update-alternatives: using /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in manual mode.
[19:37:24]@~$ java -version
java version "1.6.0_35"
OpenJDK Runtime Environment (IcedTea6 1.13.7) (6b35-1.13.7-1ubuntu0.12.04.2)
OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)
[19:37:26]@~$
可见我们已经将java的版本从1.8切换到1.6了,这样我们来看一下软链接实例:

lrwxrwxrwx 1 root root 22 5月 6 2015 /usr/bin/java -> /etc/alternatives/java*

lrwxrwxrwx 1 root root 46 10月 28 19:37 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java*
呵呵,/usr/bin/java -> /etc/alternatives/java 的链接未改变,而改变的是/etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java

主要的几个命令用法如下:

--install
向系统中添加一个新的alternatives组,

link:指向/etc/alternatives/的符号引用

name:这个链接组的名称

path:这个命令对应的可执行文件的实际路径

priority:优先级,在auto模式下,数字较大的选项有较高的优先级

示例: sudo update-alternatives --install /usr/bin/java java /home/likewise-open/SPREADTRUM/hunter.ding/tools/jdk1.8.0_112/bin/java 1062

--remove remove from the group alternative.
移除系统中注册的某个的某个软件版本

--display display information about the group.
--list display all targets of the group.
显示命令的信息及目标文件

[19:53:34]@~$ update-alternatives --display java
java - manual mode
link currently points to /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java
/home/likewise-open/SPREADTRUM/hunter.ding/tools/jdk1.8.0_112/bin/java - priority 1062
/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java - priority 1060
/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java - priority 1061
Current 'best' version is '/home/likewise-open/SPREADTRUM/hunter.ding/tools/jdk1.8.0_112/bin/java

[19:53:49]@~$ update-alternatives --list java
/home/likewise-open/SPREADTRUM/hunter.ding/tools/jdk1.8.0_112/bin/java
/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java
/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java

--config show alternatives for the group and ask the user to select which one to use.
配置命令的版本,如下:

[19:55:48]@~$ sudo update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).

Selection Path Priority Status

0 /home/likewise-open/SPREADTRUM/hunter.ding/tools/jdk1.8.0_112/bin/java 1062 auto mode

  • 1 /home/likewise-open/SPREADTRUM/hunter.ding/tools/jdk1.8.0_112/bin/java 1062 manual mode
    2 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1060 manual mode
    3 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 1061 manual mode

Press enter to keep the current choice[*], or type selection number: 0
[19:55:56]@~$
这样就使用java1.8作为java命令的默认版本。

最后修改:2023 年 03 月 09 日
如果觉得我的文章对你有用,请随意赞赏