在Linux环境上做开发,经常需要用到不同版本的可执行文件或者动态库。
使用update-alternatives工具可以让多个版本的二进制程序或者动态库同时共存,根据需要进行切换。
$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)
update-alternatives [option...] command
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 5
sudo 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
查看一个软件安装了哪些版本
$ update-alternatives --list gcc
/usr/bin/gcc-7
/usr/bin/gcc-8
查看链接对应的详情信息
$ update-alternatives --display gcc
gcc - auto mode
link best version is /usr/bin/gcc-8
link currently points to /usr/bin/gcc-8
link gcc is /usr/bin/gcc
/usr/bin/gcc-7 - priority 5
/usr/bin/gcc-8 - priority 9
查看链接对应的详情信息。
和display命令的差别,对信息进行了格式化处理。
$ update-alternatives --query gcc
Name: gcc
Link: /usr/bin/gcc
Status: auto
Best: /usr/bin/gcc-8
Value: /usr/bin/gcc-8
Alternative: /usr/bin/gcc-7
Priority: 5
Alternative: /usr/bin/gcc-8
Priority: 9
这个名字有点奇怪,不是动作。但帮助文档man page(man命令使用参考)中确实是做为命令进行说明的。
功能是逐条显示并配置各个链接。
update-alternatives --all
目前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 mode
2 /usr/bin/gcc-8 9 manual mode
Press <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 mode
1 /usr/bin/gcc-7 5 manual mode
* 2 /usr/bin/gcc-8 9 manual mode
Press <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)
上面的命令结果: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)
删除一个链接
$ 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