linux软件版本管理命令update-alternatives使用详解
linux软件版本管理命令update-alternatives使用详解
update-alternatives命令用于处理linux系统中软件版本的切换,在各个linux发行版中均提供了该命令,命令参数略有区别,但大致是一样的。
1、注册软件
以jdk为例,安装了jdk以后,先要在update-alternatives工具中注册;
#update-alternatives--install/usr/bin/javajava/opt/jdk1.8.0_91/bin/java200 #update-alternatives--install/usr/bin/javajava/opt/jdk1.8.0_111/bin/java300
其中:
第一个参数--install表示向update-alternatives注册服务名。
第二个参数是注册最终地址,成功后将会把命令在这个固定的目的地址做真实命令的软链,以后管理就是管理这个软链;
第三个参数:服务名,以后管理时以它为关联依据。
第四个参数,被管理的命令绝对路径。
第五个参数,优先级,数字越大优先级越高。
2、查看已注册列表
#update-alternatives--displayjava java-statusisauto. linkcurrentlypointsto/opt/install/jdk1.8.0_111/bin/java /opt/install/jdk1.8.0_91/bin/java-priority200 /opt/install/jdk1.8.0_111/bin/java-priority300 Current`best'versionis/opt/install/jdk1.8.0_111/bin/java.
3、修改命令版本
注意--display开关使用时第一行信息:
java-auto/manualmode
默认为自动版本,根据优先级,使用优先级高的。
下面手动修改为jdk1.8.0_91:
交互式修改
交互式会提示一所有可用的列表,选择对应的索引确认。
#update-alternatives--configjava Thereare2programswhichprovide'java'. SelectionCommand ----------------------------------------------- 1/opt/install/jdk1.8.0_91/bin/java *+2/opt/install/jdk1.8.0_111/bin/java Entertokeepthecurrentselection[+],ortypeselectionnumber:1 #java-version javaversion"1.8.0_91" Java(TM)SERuntimeEnvironment(build1.8.0_91-b14) JavaHotSpot(TM)64-BitServerVM(build25.91-b14,mixedmode) #update-alternatives--displayjava java-statusismanual. linkcurrentlypointsto/opt/install/jdk1.8.0_91/bin/java /opt/install/jdk1.8.0_91/bin/java-priority200 /opt/install/jdk1.8.0_111/bin/java-priority300 Current`best'versionis/opt/install/jdk1.8.0_111/bin/java.
看到当前状态变成了manual。
修改为自动:
#update-alternatives--autojava #java-version javaversion"1.8.0_111" Java(TM)SERuntimeEnvironment(build1.8.0_111-b14) JavaHotSpot(TM)64-BitServerVM(build25.111-b14,mixedmode) #update-alternatives--displayjava java-statusisauto. linkcurrentlypointsto/opt/install/jdk1.8.0_111/bin/java /opt/install/jdk1.8.0_91/bin/java-priority200 /opt/install/jdk1.8.0_111/bin/java-priority300 Current`best'versionis/opt/install/jdk1.8.0_111/bin/java.
又改为按照优先级高的了。
立即修改
除了交互式修改,也可以使用一条命令直接修改,修改后立即生效。
#update-alternatives--setjava/opt/jdk1.8.0_91/bin/java
该情形适用于你对路径很熟悉,或者你已经进入了该路径:
#cd/opt/jdk1.8.0_91/bin/ #update-alternatives--setjava$PWD/java
4、update-alternatives是偏门命令吗?
可能你觉得这个命令很偏门,用处不大,但实际上在linux中早已被大量的使用。我们来挖掘一下,先看看我们注册的java做了什么:
#ls-l/usr/bin/java lrwxrwxrwx1rootroot22Jan1601:45/usr/bin/java->/etc/alternatives/java* #ls-l/etc/alternatives/ total12 drwxr-xr-x2rootroot4096Jan1601:57./ drwxr-xr-x95rootroot4096Jan1601:41../ lrwxrwxrwx1rootroot13Dec212:40awk->/usr/bin/gawk* lrwxrwxrwx1rootroot29Dec212:40awk.1.gz->/usr/share/man/man1/gawk.1.gz lrwxrwxrwx1rootroot38Dec212:38builtins.7.gz->/usr/share/man/man7/bash-builtins.7.gz lrwxrwxrwx1rootroot12Jan1202:04c++->/usr/bin/g++* ...
首先可以看到我们的/usr/bin/java是一个软链,它连接到/etc/alternatives目录中的另一个软链。
而/etc/alternatives中有很多软链,这里只列出了一部分。看到awk了吧?来看看它有哪些版本:
#update-alternatives--displayawk awk-automode linkbestversionis/usr/bin/gawk linkcurrentlypointsto/usr/bin/gawk linkawkis/usr/bin/awk slaveawk.1.gzis/usr/share/man/man1/awk.1.gz slavenawkis/usr/bin/nawk slavenawk.1.gzis/usr/share/man/man1/nawk.1.gz /usr/bin/gawk-priority10 slaveawk.1.gz:/usr/share/man/man1/gawk.1.gz slavenawk:/usr/bin/gawk slavenawk.1.gz:/usr/share/man/man1/gawk.1.gz /usr/bin/mawk-priority5 slaveawk.1.gz:/usr/share/man/man1/mawk.1.gz slavenawk:/usr/bin/mawk slavenawk.1.gz:/usr/share/man/man1/mawk.1.gz
5、管理软件包
开始我们以java为例,作为jre运行环境可以,但如果你作为开发测试环境,你会发现javac找不到。
#javac -bash:javac:commandnotfound
原因是我们只对java命令做了版本管理。
事实上,update-alternatives的原理是软链管理,可以处理目录。那么我们就可以把整个软件包目录都纳入管理。
首先清理掉原来配置的java命令配置。
#update-alternatives--removejava/opt/jdk1.8.0_91/bin/java #update-alternatives--removejava/opt/jdk1.8.0_111/bin/java
ubuntu里可以直接使用下面的全部清除,centos没有:
#update-alternatives--remove-alljava
注册javahome管理
#update-alternatives--install/usr/local/jdkjdk/opt/jdk1.8.0_111300 update-alternatives:using/opt/jdk1.8.0_111toprovide/usr/local/jdk(jdk)inautomode #update-alternatives--install/usr/local/jdkjdk/opt/jdk1.8.0_91200 #update-alternatives--displayjdk jdk-automode linkbestversionis/opt/jdk1.8.0_111 linkcurrentlypointsto/opt/jdk1.8.0_111 linkjdkis/usr/local/jdk /opt/jdk1.8.0_111-priority300 /opt/jdk1.8.0_91-priority200
配置jdk环境变量,指向注册的软链地址。
#echoexportJAVA_HOME=/usr/local/jdk>>~/.bash_profile #echoexportPATH=$PATH:$JAVA_HOME/bin>>~/.bash_profile #source~/.bash_profile
管理JAVA_HOME
#echo$JAVA_HOME /usr/local/jdk #java-version javaversion"1.8.0_111" Java(TM)SERuntimeEnvironment(build1.8.0_111-b14) JavaHotSpot(TM)64-BitServerVM(build25.111-b14,mixedmode) #javac-version javac1.8.0_111 #update-alternatives--configjdk Thereare2choicesforthealternativejdk(providing/usr/local/jdk). SelectionPathPriorityStatus ------------------------------------------------------------ *0/opt/jdk1.8.0_111300automode 1/opt/jdk1.8.0_111300manualmode 2/opt/jdk1.8.0_91200manualmode Presstokeepthecurrentchoice[*],ortypeselectionnumber:2 update-alternatives:using/opt/jdk1.8.0_91toprovide/usr/local/jdk(jdk)inmanualmode #echo$JAVA_HOME /usr/local/jdk #java-version javaversion"1.8.0_91" Java(TM)SERuntimeEnvironment(build1.8.0_91-b14) JavaHotSpot(TM)64-BitServerVM(build25.91-b14,mixedmode) #javac-version javac1.8.0_91
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!