当前位置:   article > 正文

linux 软件版本切换命令 update-alternatives 使用心得_sudo update-alternatives --install /usr/bin/gcc gc

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc

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

使用方法

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

/usr/bin/gcc-5
/usr/bin/g++-5
/usr/local/bin/gcc-7
/usr/local/bin/g++-7
  • 1
  • 2
  • 3
  • 4

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

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 一同切换
  • 1
  • 2
  • 3
  • 4

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

$ 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

移除某个版本:

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

原理分析

出于好奇,可以看看这个 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

至此,大概也就明白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
  • 1
  • 2

可以看到,/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 才能生效。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号