原创-转载请注明 http://tramp.cincout.cn/2017/09/27/linux-2017-09-27-debian-update-alternatives/
摘要
在 Debian 系统,比如 Ubuntu 中,经常会出现一个软件安装多个版本或类别的需求,而在使用时可以方便的切换。update-alternatives 就是用来在 Debian 系统中维护系统命令连接符的工具。
通过一定的设置,可以实现系统自动的选择最新的软件版本或最合适的软件类别。比如,维护系统的多个JDK 的版本;维护editor 命令所对应的编辑工具是 vim 或 emacs。
命令介绍
基本的命令格式
在Ubuntu 的终端中输入 man update-alternatives 就可以查看该命令的详细使用信息。
命令的基本格式:
update-alternatives [option...] command
install 命令
install 命令用来增加一组新的系统命令连接符。
update-alternatives --install link name path priority [--slave link name path]...
sudo update-alternatives --install /usr/bin/java java /usr/local/java/jdk-9/bin/java 1702
-
link 系统中功能相同的软u件的公共链接目录。比如
/usr/bin/java -
name 命令连接符在
alternatives目录的名字 -
path 需要被链接的软件的目录,比如
/usr/local/java/jdk-9/bin/java -
priority 优先级,数值越大优先级越高。当
alternative为auto模式时,系统会自动选择优先级高的软件 -
slave
slave创建的链接从属某一个主链接。
查看命令
display
update-alternatives --display name 用来展示某一个 name 的包含的链接的详细信息。包括模式、优先级以及当前最佳的软件版本。
~$ update-alternatives --display java
java - manual mode
link currently points to /usr/local/java/jdk1.8.0_111/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
/usr/local/java/jdk-9/bin/java - priority 1074
/usr/local/java/jdk1.7.0_79/bin/java - priority 1072
/usr/local/java/jdk1.8.0_111/bin/java - priority 1073
Current 'best' version is '/usr/local/java/jdk-9/bin/java'.
update-alternatives --query 以更友好的格式来查看。
update-alternatives --list 展示更简洁的信息。
config 命令
config 命令允许我们以交互的形式进行软件的切换。
~$ sudo update-alternatives --config java
[sudo] password for zhaoyu:
There are 4 choices for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/local/java/jdk-9/bin/java 1074 auto mode
1 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 1071 manual mode
2 /usr/local/java/jdk-9/bin/java 1074 manual mode
3 /usr/local/java/jdk1.7.0_79/bin/java 1072 manual mode
* 4 /usr/local/java/jdk1.8.0_111/bin/java 1073 manual mode
Press enter to keep the current choice[*], or type selection number:
在上述模式下,输入我们想要切换的软件编号即可。
remove 命令
update-alternatives --remove name path 命令可以用来移除某个指定的name 中的某个软件版本。比如:
sudo update-alternatives --remove java /usr/local/java/jdk1.6.0_45/bin/java
-- remove-all name 可以用来移除某一name 下的所有软件。
auto 命令
update-alternatives --auto name 命令可以用来设置某一name 的软件管理模式为自动。设置完成后,会根据priority 选择版本高的软件。
总结
update-alternatives 命令方便地用来进行JDK 的版本管理,包括java javac javap jar 等命令都可以配置。如下:
sudo update-alternatives --install /usr/bin/javac javac /usr/local/jdk1.7.0_80/bin/javac 300
使用该方法管理JDK 时,需要注意$JAVA_HOME PATH 的配置:
# java environment
export JAVA_HOME=/usr/local/java/jdk1.8.0_111
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
要先查找
$PATH(PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin) 而不是$JAVA_HOME对应的路径(PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH)。