update-alternatives 修改默认命令链接

update-alternatives, 是用来维护命令链接的工具, 具体有什么用、怎么用以及它的工作方式等内容,就通过接下来的示例说明。

以 java 命令为例子


查看当前 java 命令使用的是哪个版本。

$ ll /usr/bin/java
lrwxrwxrwx 1 root root 22 Sep 10 13:14 /usr/bin/java -> /etc/alternatives/java*

$ ll /etc/alternatives/java
lrwxrwxrwx 1 root root 46 Sep 10 13:14 /etc/alternatives/java -> /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java*

从上可知, 使用的是 java-7-openjdk-amd64。

--display & --query


同时, 我们可以用 update-alternatives 查看当前的 java 对应的是哪个 bin。

--display 查看当前使用的:

$ update-alternatives --display java
java - auto mode
link currently points to /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java - priority 1071
slave java.1.gz: /usr/lib/jvm/java-7-openjdk-amd64/jre/man/man1/java.1.gz
Current 'best' version is '/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java'.

--query 显示更多的 alternatives :

niko@ubuntu14:~$ update-alternatives --query java
Name: java
Link: /usr/bin/java
Slaves:
java.1.gz /usr/share/man/man1/java.1.gz
Status: auto
Best: /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
Value: /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java

Alternative: /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
Priority: 1071
Slaves:
java.1.gz /usr/lib/jvm/java-7-openjdk-amd64/jre/man/man1/java.1.gz

--install


使用 --install 可以新增我们的 jdk 8 java 命令 ,使用方法是:

update-alternatives --install needs <link> <name> <path> <priority>

执行:

sudo update-alternatives --install "/usr/bin/java" "java" "/usr/local/java/jdk1.8.0_66/bin/java" 3

查看 install 结果:

$ update-alternatives --query java
Name: java
Link: /usr/bin/java
Slaves:
java.1.gz /usr/share/man/man1/java.1.gz
Status: auto
Best: /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
Value: /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java

Alternative: /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
Priority: 1071
Slaves:
java.1.gz /usr/lib/jvm/java-7-openjdk-amd64/jre/man/man1/java.1.gz

Alternative: /usr/local/java/jdk1.8.0_66/bin/java
Priority: 3
Slaves:


$ sudo update-alternatives --display java
java - manual mode
link currently points to /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java - priority 5
/usr/local/java/jdk1.8.0_66/bin/java - priority 3
Current 'best' version is '/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java'.

如上可知, java 还是 7 的版本。

--config


此时, 需要用 --config 设置想要的 alternative :

sudo update-alternatives --config java

$ 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-7-openjdk-amd64/jre/bin/java 1071 auto mode
1 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 1071 manual mode
2 /usr/local/java/jdk1.8.0_66/bin/java 3 manual mode

Press enter to keep the current choice[*], or type selection number: 2
update-alternatives: using /usr/local/java/jdk1.8.0_66/bin/java to provide /usr/bin/java (java) in manual mode

如上, 可以选择想要的 alternatives,下面测试是否确实切换成功:

$ java -version
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)

再看链接, 发现也已经被修改了, 如下:

$ ll /usr/bin/java
lrwxrwxrwx 1 root root 22 Sep 10 13:14 /usr/bin/java -> /etc/alternatives/java*
niko@ubuntu14:~$ ll /etc/alternatives/java
lrwxrwxrwx 1 root root 36 Dec 7 01:09 /etc/alternatives/java -> /usr/local/java/jdk1.8.0_66/bin/java*

如上, 更新成功了,使用 java 命令默认使用 Java 8 了。

--remove


上面查看 java 时, 觉得第一行和第二行重复了,可以删掉不想要的 alternatives, 用法:

sudo update-alternatives --remove name path

具体例子, 如下移除成功:

sudo update-alternatives --remove java /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
$ update-alternatives --query java
Name: java
Link: /usr/bin/java
Status: manual
Best: /usr/local/java/jdk1.8.0_66/bin/java
Value: /usr/local/java/jdk1.8.0_66/bin/java

Alternative: /usr/local/java/jdk1.8.0_66/bin/java
Priority: 3

--set


除了 --config , 还可以更直接使用 --set 进行设置(不过必须先 --install ):

# 查看当前的选择
niko@ubuntu14:~$ sudo update-alternatives --query java
Name: java
Link: /usr/bin/java
Status: manual
Best: /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
Value: /usr/local/java/jdk1.8.0_66/bin/java

Alternative: /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
Priority: 5

Alternative: /usr/local/java/jdk1.8.0_66/bin/java
Priority: 3

# 查看可知当前使用的是 jdk 8
$ sudo update-alternatives --display java
java - manual mode
link currently points to /usr/local/java/jdk1.8.0_66/bin/java
/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java - priority 5
/usr/local/java/jdk1.8.0_66/bin/java - priority 3
Current 'best' version is '/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java'.

# 设置使用 jdk7
$ sudo update-alternatives --set java /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
update-alternatives: using /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in manual mode

# 显示使用 jdk7 了, 设置成功
$ update-alternatives --display java
java - manual mode
link currently points to /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java - priority 5
/usr/local/java/jdk1.8.0_66/bin/java - priority 3
Current 'best' version is '/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java'.

# 1.7
$ java -version
java version "1.7.0_111"
OpenJDK Runtime Environment (IcedTea 2.6.7) (7u111-2.6.7-0ubuntu0.14.04.3)
OpenJDK 64-Bit Server VM (build 24.111-b01, mixed mode)

参考


https://www.thomas-krenn.com/en/wiki/Manual_Installation_of_Oracle_Java_JRE_6_or_SE_7_in_Ubuntu