linux 软件版本切换命令 update-alternatives 使用心得

这真的是一个很好用的命令,合乎逻辑,操作简单。

使用方法

比如,我有两个版本的gcc及g++,分别在如下两个目录:

/usr/bin/gcc-5
/usr/bin/g++-5
/usr/local/bin/gcc-7
/usr/local/bin/g++-7

首先将这两个版本都配置好,具体的用法参照这里

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50 --slave /usr/bin/g++ g++ /usr/bin/g++-5
sudo update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/gcc-7 40 --slave /usr/bin/g++ g++ /usr/local/bin/g++-7
# 50,70是优先级,优先级高在auto模式下会被自动选定。
# --slave 表示其后的版本会跟随 gcc 一同切换

配置好后,使用如下命令选择需要的版本

$ sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).

  Selection    Path                  Priority   Status
------------------------------------------------------------
* 0            /usr/local/bin/gcc-7   70        auto mode
  1            /usr/bin/gcc-5         40        manual mode
  2            /usr/local/bin/gcc-7   70        manual mode

Press <enter> to keep the current choice[*], or type selection number: 1

移除某个版本:

sudo update-alternatives --remove gcc /usr/bin/* # *为指定版本,如gcc-5

原理分析

出于好奇,可以看看这个 update-alternatives 命令是如何实现的。

'首先看一下使用gcc命令时,被调用的gcc存在了哪里'
book@www.100ask.org:~$ which gcc
/usr/bin/gcc
'看一下这个/usr/bin/gcc 文件'
book@www.100ask.org:~$ ls /usr/bin/gcc -l
lrwxrwxrwx 1 root root 21 2月  24 11:36 /usr/bin/gcc -> /etc/alternatives/gcc
'继续查看软链接的指向'
book@www.100ask.org:~$ ls /etc/alternatives/gcc -l
lrwxrwxrwx 1 root root 14 2月  24 12:01 /etc/alternatives/gcc -> /usr/bin/gcc-5

至此,大概也就明白update-alternatives 命令是如何工作的了,如下
在这里插入图片描述

遇到的问题

我的gcc-7 是自己编译安装的,它默认的目录是 /usr/local/bin/gcc,没错,名字就是gcc,而不是gcc-7。刚开始有个奇怪的问题,我使用update-alternatives --config gcc 无论怎么切换,gcc -v显示始终都是 7,怎么都切不到 gcc-5 上去。

这里就要注意了,看下环境变量里目录的优先级:

book@www.100ask.org:~$ echo $PATH
/home/book/bin:/home/book/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/work/tools/gcc-3.4.5-glibc-2.3.6/bin:/work/tools/gcc-3.4.5-glibc-2.3.6/bin/:/snap/bin:/work/tools/gcc-arm-8.2-2019.01/gcc-arm-8.2-2019.01-x86_64-aarch64-linux-gnu/bin

可以看到,/usr/local/bin 是排在 /usr/bin 前面的,所以每次使用 gcc 命令是,会直接访问到 /usr/local/bin/gcc ,而不是/usr/bin/gcc -> /etc/alternatives/gcc -> /usr/bin/gcc-X

解决也很简单,把/usr/local/bin/gcc 的名字改成 gcc-7 就行了。重新update-alternatives --install后可能需要重启一下shell 才能生效。

当你使用`sudo update-alternatives --config python`命令尝试切换Python版本时,如果无法成功,可能有以下几种情况: 1. `update-alternatives`服务没有正确配置:可能是因为`update-alternatives`系统没有为Python设置好替代方案。你可以使用`update-alternatives --list python`来查看当前系统中所有已配置的Python版本。 2. 权限不足:使用`sudo`是为了获取管理员权限,但是有时可能因为一些系统策略或其他原因,即便使用了`sudo`,命令也无法执行。检查系统是否有特别的配置或者策略限制了管理员的某些操作。 3. 环境变量问题:在某些情况下,可能系统环境变量没有正确设置,导致无法识别`python`命令。可以检查系统的PATH环境变量,确保它包含了正确版本Python的可执行文件路径。 为了解决这些问题,可以尝试以下步骤: 1. 确认`update-alternatives`服务已经为Python配置了多个版本。可以使用以下命令查看: ``` sudo update-alternatives --list python ``` 2. 检查当前链接到的Python版本,可以使用以下命令查看: ``` sudo update-alternatives --display python ``` 3. 如果确认了多个版本配置正确,但是仍然不能切换,可以尝试重新配置`update-alternatives`服务。使用以下命令重新设置Python的优先级: ``` sudo update-alternatives --config python ``` 4. 确保系统环境变量PATH包含了你希望使用的Python版本的路径。可以在`~/.bashrc`、`~/.profile`或者`/etc/profile`中添加相应的路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值