Skip to content

cmd - update-alternatives

在Debian系统中,我们可能会同时安装有很多功能类似的程序和可选配置,可能会出现同一软件的多个版本并存的场景。比如像是一些编程语言工具,一些系统中自带的是python2.6,而现在python2.7和python3.4使用较多,还有java有1.6,1.7和1.8版本。 update-alternatives是Debian系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令、哪个软件版本,比如系统中同时安装了open jdk和sun jdk两个版本,而我们又希望系统默认使用sun jdk,通过update-alternatives就可以方便实现管理。 ———————————————— 版权声明:本文为CSDN博主「JasonDing1354」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/JasonDing1354/article/details/50470109

[[toc]]

管理多个版本的gcc/g++

为什么要使用update-alternatives来管理多个版本?因为不同的sdk,可能需要采用不同的gcc、g++版本才能编译通过

  • 先安装多个版本gcc/g++,下面以9/10/11版本为例
sudo apt install gcc-9 g++-9 gcc-10 g++-10 gcc-11 g++-11
  • 运行ls /usr/bin/gcc* -lh可以看到存在多个版本的gcc,并且采用的都是软链接来管理

image-20221024094945298

  • 使用如下脚本生成update-alternatives的命令,不建议手动写,因为依赖太多
#!/usr/bin/env bash

test -n "$DEBUG" && set -x
# Modo strict
set -euo pipefail
versions=(
9 10 11
)

let i=90

for v in ${versions[*]}; do
    echo -e '\e[1;49;36m'gcc-${v}'\e[0m' >&2
    echo -n sudo update-alternatives
    echo -n " "--install /usr/bin/gcc gcc /usr/bin/gcc-$v $i
    dpkg -L gcc-$v g++-$v|
        awk -F'/bin/' '/.*bin\// {print $2}' |
            while read line; do
                [[ "$line" == "gcc-$v" ]] && continue
                cmd=${line%-*}
                echo -n " "--slave /usr/bin/$cmd $cmd /usr/bin/$line
            done
    echo
    let i=$((i + 10))

done

# ----------------------------------------------------------------------------
exit 0

运行上面脚本后,输出如下

$ ./gcc-update-alternatives.sh   
gcc-9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/x86_64-linux-gnu-gcc x86_64-linux-gnu-gcc /usr/bin/x86_64-linux-gnu-gcc-9 --slave /usr/bin/x86_64-linux-gnu-gcc-ar x86_64-linux-gnu-gcc-ar /usr/bin/x86_64-linux-gnu-gcc-ar-9 --slave /usr/bin/x86_64-linux-gnu-gcc-nm x86_64-linux-gnu-gcc-nm /usr/bin/x86_64-linux-gnu-gcc-nm-9 --slave /usr/bin/x86_64-linux-gnu-gcc-ranlib x86_64-linux-gnu-gcc-ranlib /usr/bin/x86_64-linux-gnu-gcc-ranlib-9 --slave /usr/bin/x86_64-linux-gnu-gcov x86_64-linux-gnu-gcov /usr/bin/x86_64-linux-gnu-gcov-9 --slave /usr/bin/x86_64-linux-gnu-gcov-dump x86_64-linux-gnu-gcov-dump /usr/bin/x86_64-linux-gnu-gcov-dump-9 --slave /usr/bin/x86_64-linux-gnu-gcov-tool x86_64-linux-gnu-gcov-tool /usr/bin/x86_64-linux-gnu-gcov-tool-9 --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-9 --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-9 --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9 --slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-9 --slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-9 --slave /usr/bin/x86_64-linux-gnu-g++ x86_64-linux-gnu-g++ /usr/bin/x86_64-linux-gnu-g++-9 --slave /usr/bin/g++ g++ /usr/bin/g++-9
gcc-10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/x86_64-linux-gnu-gcc x86_64-linux-gnu-gcc /usr/bin/x86_64-linux-gnu-gcc-10 --slave /usr/bin/x86_64-linux-gnu-gcc-ar x86_64-linux-gnu-gcc-ar /usr/bin/x86_64-linux-gnu-gcc-ar-10 --slave /usr/bin/x86_64-linux-gnu-gcc-nm x86_64-linux-gnu-gcc-nm /usr/bin/x86_64-linux-gnu-gcc-nm-10 --slave /usr/bin/x86_64-linux-gnu-gcc-ranlib x86_64-linux-gnu-gcc-ranlib /usr/bin/x86_64-linux-gnu-gcc-ranlib-10 --slave /usr/bin/x86_64-linux-gnu-gcov x86_64-linux-gnu-gcov /usr/bin/x86_64-linux-gnu-gcov-10 --slave /usr/bin/x86_64-linux-gnu-gcov-dump x86_64-linux-gnu-gcov-dump /usr/bin/x86_64-linux-gnu-gcov-dump-10 --slave /usr/bin/x86_64-linux-gnu-gcov-tool x86_64-linux-gnu-gcov-tool /usr/bin/x86_64-linux-gnu-gcov-tool-10 --slave /usr/bin/x86_64-linux-gnu-lto-dump x86_64-linux-gnu-lto-dump /usr/bin/x86_64-linux-gnu-lto-dump-10 --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-10 --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-10 --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-10 --slave /usr/bin/gcov gcov /usr/bin/gcov-10 --slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-10 --slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-10 --slave /usr/bin/lto-dump lto-dump /usr/bin/lto-dump-10 --slave /usr/bin/x86_64-linux-gnu-g++ x86_64-linux-gnu-g++ /usr/bin/x86_64-linux-gnu-g++-10 --slave /usr/bin/g++ g++ /usr/bin/g++-10
gcc-11
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 110 --slave /usr/bin/x86_64-linux-gnu-gcc x86_64-linux-gnu-gcc /usr/bin/x86_64-linux-gnu-gcc-11 --slave /usr/bin/x86_64-linux-gnu-gcc-ar x86_64-linux-gnu-gcc-ar /usr/bin/x86_64-linux-gnu-gcc-ar-11 --slave /usr/bin/x86_64-linux-gnu-gcc-nm x86_64-linux-gnu-gcc-nm /usr/bin/x86_64-linux-gnu-gcc-nm-11 --slave /usr/bin/x86_64-linux-gnu-gcc-ranlib x86_64-linux-gnu-gcc-ranlib /usr/bin/x86_64-linux-gnu-gcc-ranlib-11 --slave /usr/bin/x86_64-linux-gnu-gcov x86_64-linux-gnu-gcov /usr/bin/x86_64-linux-gnu-gcov-11 --slave /usr/bin/x86_64-linux-gnu-gcov-dump x86_64-linux-gnu-gcov-dump /usr/bin/x86_64-linux-gnu-gcov-dump-11 --slave /usr/bin/x86_64-linux-gnu-gcov-tool x86_64-linux-gnu-gcov-tool /usr/bin/x86_64-linux-gnu-gcov-tool-11 --slave /usr/bin/x86_64-linux-gnu-lto-dump x86_64-linux-gnu-lto-dump /usr/bin/x86_64-linux-gnu-lto-dump-11 --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-11 --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-11 --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-11 --slave /usr/bin/gcov gcov /usr/bin/gcov-11 --slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-11 --slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-11 --slave /usr/bin/lto-dump lto-dump /usr/bin/lto-dump-11 --slave /usr/bin/x86_64-linux-gnu-g++ x86_64-linux-gnu-g++ /usr/bin/x86_64-linux-gnu-g++-11 --slave /usr/bin/g++ g++ /usr/bin/g++-11

将上面的输出,填入控制台,即可完成配置

  • --display \<name>

显示gcc的版本列表

$ sudo update-alternatives --display gcc 
gcc - manual mode
  link best version is /usr/bin/gcc-11
  link currently points to /usr/bin/gcc-9
  link gcc is /usr/bin/gcc
  slave g++ is /usr/bin/g++
  slave gcc-ar is /usr/bin/gcc-ar
  slave gcc-nm is /usr/bin/gcc-nm
  slave gcc-ranlib is /usr/bin/gcc-ranlib
  slave gcov is /usr/bin/gcov
  slave gcov-dump is /usr/bin/gcov-dump
  slave gcov-tool is /usr/bin/gcov-tool
  slave lto-dump is /usr/bin/lto-dump
  slave x86_64-linux-gnu-g++ is /usr/bin/x86_64-linux-gnu-g++
  slave x86_64-linux-gnu-gcc is /usr/bin/x86_64-linux-gnu-gcc
  slave x86_64-linux-gnu-gcc-ar is /usr/bin/x86_64-linux-gnu-gcc-ar
  slave x86_64-linux-gnu-gcc-nm is /usr/bin/x86_64-linux-gnu-gcc-nm
  slave x86_64-linux-gnu-gcc-ranlib is /usr/bin/x86_64-linux-gnu-gcc-ranlib
  slave x86_64-linux-gnu-gcov is /usr/bin/x86_64-linux-gnu-gcov
  slave x86_64-linux-gnu-gcov-dump is /usr/bin/x86_64-linux-gnu-gcov-dump
  slave x86_64-linux-gnu-gcov-tool is /usr/bin/x86_64-linux-gnu-gcov-tool
  slave x86_64-linux-gnu-lto-dump is /usr/bin/x86_64-linux-gnu-lto-dump
/usr/bin/gcc-10 - priority 100
  slave g++: /usr/bin/g++-10
  slave gcc-ar: /usr/bin/gcc-ar-10
  slave gcc-nm: /usr/bin/gcc-nm-10
  slave gcc-ranlib: /usr/bin/gcc-ranlib-10
  slave gcov: /usr/bin/gcov-10
  slave gcov-dump: /usr/bin/gcov-dump-10
  slave gcov-tool: /usr/bin/gcov-tool-10
  slave lto-dump: /usr/bin/lto-dump-10
  slave x86_64-linux-gnu-g++: /usr/bin/x86_64-linux-gnu-g++-10
  slave x86_64-linux-gnu-gcc: /usr/bin/x86_64-linux-gnu-gcc-10
  slave x86_64-linux-gnu-gcc-ar: /usr/bin/x86_64-linux-gnu-gcc-ar-10
  slave x86_64-linux-gnu-gcc-nm: /usr/bin/x86_64-linux-gnu-gcc-nm-10
  slave x86_64-linux-gnu-gcc-ranlib: /usr/bin/x86_64-linux-gnu-gcc-ranlib-10
  slave x86_64-linux-gnu-gcov: /usr/bin/x86_64-linux-gnu-gcov-10
  slave x86_64-linux-gnu-gcov-dump: /usr/bin/x86_64-linux-gnu-gcov-dump-10
  slave x86_64-linux-gnu-gcov-tool: /usr/bin/x86_64-linux-gnu-gcov-tool-10
  slave x86_64-linux-gnu-lto-dump: /usr/bin/x86_64-linux-gnu-lto-dump-10
/usr/bin/gcc-11 - priority 110
  slave g++: /usr/bin/g++-11
  slave gcc-ar: /usr/bin/gcc-ar-11
  slave gcc-nm: /usr/bin/gcc-nm-11
  slave gcc-ranlib: /usr/bin/gcc-ranlib-11
  slave gcov: /usr/bin/gcov-11
  slave gcov-dump: /usr/bin/gcov-dump-11
  slave gcov-tool: /usr/bin/gcov-tool-11
  slave lto-dump: /usr/bin/lto-dump-11
  slave x86_64-linux-gnu-g++: /usr/bin/x86_64-linux-gnu-g++-11
  slave x86_64-linux-gnu-gcc: /usr/bin/x86_64-linux-gnu-gcc-11
  slave x86_64-linux-gnu-gcc-ar: /usr/bin/x86_64-linux-gnu-gcc-ar-11
  slave x86_64-linux-gnu-gcc-nm: /usr/bin/x86_64-linux-gnu-gcc-nm-11
  slave x86_64-linux-gnu-gcc-ranlib: /usr/bin/x86_64-linux-gnu-gcc-ranlib-11
  slave x86_64-linux-gnu-gcov: /usr/bin/x86_64-linux-gnu-gcov-11
  slave x86_64-linux-gnu-gcov-dump: /usr/bin/x86_64-linux-gnu-gcov-dump-11
  slave x86_64-linux-gnu-gcov-tool: /usr/bin/x86_64-linux-gnu-gcov-tool-11
  slave x86_64-linux-gnu-lto-dump: /usr/bin/x86_64-linux-gnu-lto-dump-11
/usr/bin/gcc-9 - priority 90
  slave g++: /usr/bin/g++-9
  slave gcc-ar: /usr/bin/gcc-ar-9
  slave gcc-nm: /usr/bin/gcc-nm-9
  slave gcc-ranlib: /usr/bin/gcc-ranlib-9
  slave gcov: /usr/bin/gcov-9
  slave gcov-dump: /usr/bin/gcov-dump-9
  slave gcov-tool: /usr/bin/gcov-tool-9
  slave x86_64-linux-gnu-g++: /usr/bin/x86_64-linux-gnu-g++-9
  slave x86_64-linux-gnu-gcc: /usr/bin/x86_64-linux-gnu-gcc-9
  slave x86_64-linux-gnu-gcc-ar: /usr/bin/x86_64-linux-gnu-gcc-ar-9
  slave x86_64-linux-gnu-gcc-nm: /usr/bin/x86_64-linux-gnu-gcc-nm-9
  slave x86_64-linux-gnu-gcc-ranlib: /usr/bin/x86_64-linux-gnu-gcc-ranlib-9
  slave x86_64-linux-gnu-gcov: /usr/bin/x86_64-linux-gnu-gcov-9
  slave x86_64-linux-gnu-gcov-dump: /usr/bin/x86_64-linux-gnu-gcov-dump-9
  slave x86_64-linux-gnu-gcov-tool: /usr/bin/x86_64-linux-gnu-gcov-tool-9
  • --config \<name>

配置选择gcc的版本

$ sudo update-alternatives --config gcc 

Python2和python3的切换

背景:有些老旧的openwrt编译用的是python2,高版本的ubuntu通常自带python3,这时我们需要切换python2。

sudo apt install python2
python2 -V
ls /usr/bn/python*

查看是否配置了python方案

sudo update-alternatives --list python 
update-alternatives: error: no alternatives for python

设置替代版本:

sudo update-alternatives --list python

update-alternatives: error: no alternatives for python

sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1

update-alternatives: using /usr/bin/python2 to provide /usr/bin/python (python) in auto mode

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 2

update-alternatives: using /usr/bin/python3 to provide /usr/bin/python (python) in auto mode

切换Python版本

sudo update-alternatives --config python

There are 2 choices for the alternative python (providing /usr/bin/python).

* 0            /usr/bin/python3   2         auto mode
  1            /usr/bin/python2   1         manual mode
  2            /usr/bin/python3   2         manual mode
Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/bin/python2 to provide /usr/bin/python (python) in manual mode
  • 安装完Python2后再执行一遍update 和 install操作xxxxx