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版本为例
- 运行ls /usr/bin/gcc* -lh可以看到存在多个版本的gcc,并且采用的都是软链接来管理
- 使用如下脚本生成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的版本
Python2和python3的切换¶
背景:有些老旧的openwrt编译用的是python2,高版本的ubuntu通常自带python3,这时我们需要切换python2。
查看是否配置了python方案
设置替代版本:
update-alternatives: error: no alternatives for python
update-alternatives: using /usr/bin/python2 to provide /usr/bin/python (python) in auto mode
update-alternatives: using /usr/bin/python3 to provide /usr/bin/python (python) in auto mode
切换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