> 文章列表 > 在Linux上用update-alternatives配置多版本切换

在Linux上用update-alternatives配置多版本切换

在Linux上用update-alternatives配置多版本切换

在Linux环境上做开发,经常需要用到不同版本的可执行文件或者动态库。
使用update-alternatives工具可以让多个版本的二进制程序或者动态库同时共存,根据需要进行切换。

基本原理

  1. 二进制程序名称带版本号,例如:gcc-7, gcc-8。
  2. 通过软连接,创建不带版本号的名称,例如:/usr/bin/gcc。
    用软连接指向实际使用的程序,例如:/usr/bin/gcc -> /usr/bin/gcc-7
  3. 默认使用不带版本号的名称使用命令,例如:
$gcc -v
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) $gcc-7 -v
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 
  1. update-alternatives命令通过修改连接指向不同的实际程序或者动态库,实现多版本共存,动态切换的效果。

命令格式

update-alternatives [option...] command

install命令

update-alternatives --install link name path priority

link 不带版本号的链接名,例如:/usr/bin/gcc。
name update-alternatives数据库中的名称,创建后可以通过这个名称来管理软件。用户自定义。
path 实际可执行程序的path,例如:/usr/bin/gcc-7。
priority 优先级。update-alternatives有2中模式:手动(manual)和自动(auto),前者是用户明确指定使用哪个版本;auto模式,会使用高优先级(数值大)的程序版本。

install命令示例:
分别创建gcc和g++的链接,并设置gcc-8为高优先级。

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 5sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 5
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 9

list命令

查看一个软件安装了哪些版本

$ update-alternatives --list gcc
/usr/bin/gcc-7
/usr/bin/gcc-8

display命令

查看链接对应的详情信息

$ update-alternatives --display gcc
gcc - auto modelink best version is /usr/bin/gcc-8link currently points to /usr/bin/gcc-8link gcc is /usr/bin/gcc
/usr/bin/gcc-7 - priority 5
/usr/bin/gcc-8 - priority 9

query命令

查看链接对应的详情信息。
和display命令的差别,对信息进行了格式化处理。

$ update-alternatives --query gcc
Name: gcc
Link: /usr/bin/gcc
Status: auto
Best: /usr/bin/gcc-8
Value: /usr/bin/gcc-8Alternative: /usr/bin/gcc-7
Priority: 5Alternative: /usr/bin/gcc-8
Priority: 9

all命令

这个名字有点奇怪,不是动作。但帮助文档man page(man命令使用参考)中确实是做为命令进行说明的。
功能是逐条显示并配置各个链接。

update-alternatives --all

config命令切换版本

目前gcc->gcc-7,使用config命令,让gcc->gcc-8。
config命令显示链接所对应程序的各个版本的一个列表,通过数字进行选择。

$ sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).Selection    Path            Priority   Status
------------------------------------------------------------0            /usr/bin/gcc-8   9         auto mode
* 1            /usr/bin/gcc-7   5         manual mode2            /usr/bin/gcc-8   9         manual modePress <enter> to keep the current choice[*], or type selection number: 2
update-alternatives: using /usr/bin/gcc-8 to provide /usr/bin/gcc (gcc) in manual mode
$ gcc -v
gcc version 8.4.0 (Ubuntu 8.4.0-1ubuntu1~18.04) 

下面再切换会gcc-7,为了后面演示auto命令效果。

$ sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).Selection    Path            Priority   Status
------------------------------------------------------------0            /usr/bin/gcc-8   9         auto mode1            /usr/bin/gcc-7   5         manual mode
* 2            /usr/bin/gcc-8   9         manual modePress <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/bin/gcc-7 to provide /usr/bin/gcc (gcc) in manual mode$ gcc -v
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 

auto命令

上面的命令结果:gcc->gcc-7。
创建链接时,gcc-7优先级是5,gcc-8优先级是9(更高)。
使用auto模式,应该会自动切换为gcc-8。

$ sudo update-alternatives --auto gcc
update-alternatives: using /usr/bin/gcc-8 to provide /usr/bin/gcc (gcc) in auto mode$ gcc -v
gcc version 8.4.0 (Ubuntu 8.4.0-1ubuntu1~18.04) 

remove命令

删除一个链接

$ update-alternatives --list gcc
/usr/bin/gcc-7
/usr/bin/gcc-8$ sudo update-alternatives --remove gcc /usr/bin/gcc-7$ update-alternatives --list gcc
/usr/bin/gcc-8