在 Linux 中,对于相同的功能可能会存在多种的实现,例如查看文件可以使用 head、tail、cat 等;而且,即使相同软件可能会有多个版本,例如 Python 有 2.X、3.X 版本,等等。
为了统一命令、方便管理,就可以使用 Linux 中的 alternatives 命令,这里简单介绍。
简介
在 chkconfig
包中,包含了一个 update-alternatives
命令 (与 alternatives
相同),可以对某个工具的多个版本进行管理,可以很方便设置系统默认使用哪个版本。
以编辑器为例,在 Linux 上支持 nvi、vim、emacs、nano 等等,假设希望通过 editor
直接调用一个编辑器,而且无需关心是那个。
示例
通过如下方式创建一个 editor
的命令。
alternatives --install <link> <name> <path> <priority>
<link> 使用的绝对路径,例如/bin/editor
<name> 在/etc/alternative中的名字,例如editor
<path> 可选的程序所在路径,例如/bin/vim
<priority> 优先级,越高越好
alternatives --install /bin/editor editor /bin/vim 10
alternatives --install /bin/editor editor /bin/cat 5
此时,会存在一个 /bin/editor
的符号链接,指向 /etc/alternatives/editor
符号链接,而该路径指向 /bin/vim
文件。
实现原理
实际上是通过符号连接实现,如下以 java
为例。
$ which java
/usr/bin/java
$ ls -alh /usr/bin/java
lrwxrwxrwx. 1 root root 22 Jul 24 15:41 /usr/bin/java -> /etc/alternatives/java
$ ls -alh /etc/alternatives/java
lrwxrwxrwx. 1 root root 72 Sep 2 09:42 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.422.b06-2.fc40.x86_64/jre/bin/java
以 openjdk 为例,通常包含如下三个包。
$ rpm -qa | grep java-1.8.0
java-1.8.0-openjdk-headless-1.8.0.432.b06-1.fc40.x86_64
java-1.8.0-openjdk-1.8.0.432.b06-1.fc40.x86_64
java-1.8.0-openjdk-devel-1.8.0.432.b06-1.fc40.x86_64
前两个对应了 JRE,后者则是 JDK 。
常用命令
----- 查看所有可以作为editor的命令
alternatives --display editor
----- 选择其中一个命令作为editor,此时会变成manual,包括了交互和直接设置
alternatives --config editor
alternatives --set editor /bin/vim
----- 同时再次修改为auto模式
alternatives --auto editor
----- 删除cat或者所有
alternatives --remove editor /bin/cat
alternatives --remove-all editor
----- 查看当前所有默认指向命令
alternatives --list
另外,有些软件包含有多个命令,那么就可以使用 --slave
参数,如下是一个 java
的示例。
alternatives --install /usr/bin/java java /opt/jdk/bin/java 10 \
--slave /usr/bin/jar jar /opt/jdk-10/bin/jar \
--slave /usr/bin/javac javac /opt/jdk-10/bin/javac \
--slave /usr/bin/javadoc javadoc /opt/jdk-10/bin/javadoc
也就是,可以同时配置多个。