LINUX命令:update-alternatives(软件版本管理工具)

文章详细介绍了在Ubuntu16.04LTS系统上,如何利用`update-alternatives`命令来管理Python的多个版本,包括安装配置、版本切换,以满足开发环境中对不同版本组件的需求,特别是针对AndroidAOSP编译环境的构建。此方法也可应用于其他需要多版本共存的软件管理。

前言
  在基于 LINUX 操作系统之上安装所需开发环境组件时,可能会遇到无可避免的场景是:同一个组件,我们需要同时使用到两个或者更多的版本,比如 Java 有 1.6、1.7、1.8 等多版本,又比如 Python 有 2、3 等等,这里以 Python 组件为例,以搭建一套 Android 的 AOSP 编译环境为目标,对使用 update-alternatives 命令 管理多个组件版本 进一步详解。

update-alternatives

  • 操作系统信息

    itaso@ubuntu:~$ lsb_release -a
    No LSB modules are available.
    Distributor ID:	Ubuntu
    Description:	Ubuntu 16.04.7 LTS
    Release:	16.04
    Codename:	xenial
    itaso@ubuntu:~$ 
    
  • 使用查看 update-alternatives --help

    itaso@ubuntu:~$ update-alternatives --help
    Usage: update-alternatives [<option> ...] <command>
    
    Commands:
      --install <link> <name> <path> <priority>
        [--slave <link> <name> <path>] ...
                               add a group of alternatives to the system.
      --remove <name> <path>   remove <path> from the <name> group alternative.
      --remove-all <name>      remove <name> group from the alternatives system.
      --auto <name>            switch the master link <name> to automatic mode.
      --display <name>         display information about the <name> group.
      --query <name>           machine parseable version of --display <name>.
      --list <name>            display all targets of the <name> group.
      --get-selections         list master alternative names and their status.
      --set-selections         read alternative status from standard input.
      --config <name>          show alternatives for the <name> group and ask the
                               user to select which one to use.
      --set <name> <path>      set <path> as alternative for <name>.
      --all                    call --config on all alternatives.
    
    <link> is the symlink pointing to /etc/alternatives/<name>.
      (e.g. /usr/bin/pager)
    <name> is the master name for this link group.
      (e.g. pager)
    <path> is the location of one of the alternative target files.
      (e.g. /usr/bin/less)
    <priority> is an integer; options with higher numbers have higher priority in
      automatic mode.
    
    Options:
      --altdir <directory>     change the alternatives directory.
      --admindir <directory>   change the administrative directory.
      --log <file>             change the log file.
      --force                  allow replacing files with alternative links.
      --skip-auto              skip prompt for alternatives correctly configured
                               in automatic mode (relevant for --config only)
      --verbose                verbose operation, more output.
      --quiet                  quiet operation, minimal output.
      --help                   show this help message.
      --version                show the version.
    itaso@ubuntu:~$ 
    
    itaso@ubuntu:~$ update-alternatives --help
    用法:update-alternatives [<选项> ...] <命令>
    
    命令:
      --install <链接> <名称> <路径> <优先级>
        [--slave <链接> <名称> <路径>] ...
                               在系统中加入一组候选项。
      --remove <名称> <路径><名称> 替换组中去除 <路径> 项。
      --remove-all <名称>      从替换系统中删除 <名称> 替换组。
      --auto <名称><名称> 的主链接切换到自动模式。
      --display <名称>         显示关于 <名称> 替换组的信息。
      --query <名称>           机器可读版的 --display <名称>.
      --list <名称>            列出 <名称> 替换组中所有的可用候选项。
      --get-selections         列出主要候选项名称以及它们的状态。
      --set-selections         从标准输入中读入候选项的状态。
      --config <名称>          列出 <名称> 替换组中的可选项,并就使用其中哪一个,征询用户的意见。
      --set <名称> <路径><路径> 设置为 <名称> 的候选项。
      --all                    对所有可选项一一调用 --config 命令。
    
    <链接> 是指向 /etc/alternatives/<名称> 的符号链接。(如 /usr/bin/pager)
    <名称> 是该链接替换组的主控名。(如 pager)
    <路径> 是候选项目标文件的位置。(如 /usr/bin/less)
    <优先级> 是一个整数,在自动模式下,这个数字越高的选项,其优先级也就越高。
    
    ......
    itaso@ubuntu:~$ 
    
  • 查看替换组的信息 update-alternatives --display python

    itaso@ubuntu:~$ update-alternatives --display python
    python - manual mode
      link best version is /usr/bin/python3.5
      link currently points to /usr/bin/python3.5
      link python is /usr/bin/python
    /usr/bin/python2.7 - priority 2
    /usr/bin/python3.5 - priority 3
    /usr/local/bin/python3.7 - priority 4
    itaso@ubuntu:~$ 
    
    itaso@ubuntu:~$ update-alternatives --display python
    python - 手动模式
      link best version is /usr/bin/python3.5
      链接目前指向 /usr/bin/python2.7
      link python is /usr/bin/python
    /usr/bin/python2.7 - 优先级 2
    /usr/bin/python3.5 - 优先级 3
    /usr/local/bin/python3.7 - 优先级 4
    itaso@ubuntu:~$ 
    

    或者 假装我们知道系统自带的组件都是安装在 /usr/bin 目录下,那么我们找一下它/它们

    itaso@ubuntu:/usr/bin$ cd ~
    itaso@ubuntu:~$ pwd
    /home/itaso
    itaso@ubuntu:~$ find /usr/bin/ -name "python*"
    /usr/bin/python3
    /usr/bin/python2
    /usr/bin/python3m
    /usr/bin/python3.5
    /usr/bin/python3.5m
    /usr/bin/python2.7
    /usr/bin/python
    itaso@ubuntu:~$
    

    通过使用 find 进行条件筛选,发现系统已经带有了 python2python3
    在这里插入图片描述
    备注:python2 -> python2.7 这样的 -> 表示 软连接,这里可以把 python2 看成 Windon系统 中的 快捷方式,所以这句话的意思是 python2 真正执行的目标是 python2.7
    既然系统已经有两个 Python 的版本 ,那么已经足够用来展示多版本切换,就无需在自己手动安装其他版本的 Python 了(当然,并不阻止手动自己安装一个,一般手动安装的路径是 /usr/local/bin

  • 版本管理配置 update-alternatives --install /usr/bin/python python /usr/local/bin/python3.7 4
    为了能比较有说服力的进行版本管理,这边的验证使用了自己手动安装的 Python 3.7 版本 用于区分系统自带的 2.7 和 3.5 版本
    --install 表示向 update-alternatives 注册服务名
    /usr/bin/python 表示注册最终地址,成功后将会把命令在这个固定的目的地址做真实命令的软链,以后管理就是管理这个软链
    python 表示服务名,以后管理时以它为关联依据
    /usr/local/bin/python3.7 表示被管理的命令绝对路径
    4 表示优先级,数字越大优先级越高

  • 版本切换 update-alternatives --config python

    itaso@ubuntu:~$ sudo update-alternatives --config python
    There are 3 choices for the alternative python (providing /usr/bin/python).
    
      Selection    Path                      Priority   Status
    ------------------------------------------------------------
      0            /usr/local/bin/python3.7   4         auto mode
      1            /usr/bin/python2.7         2         manual mode
      2            /usr/bin/python3.5         3         manual mode
    * 3            /usr/local/bin/python3.7   4         manual mode
    
    Press <enter> to keep the current choice[*], or type selection number: 1
    update-alternatives: using /usr/bin/python2.7 to provide /usr/bin/python (python) in manual mode
    itaso@ubuntu:~$ sudo update-alternatives --config python
    There are 3 choices for the alternative python (providing /usr/bin/python).
    
      Selection    Path                      Priority   Status
    ------------------------------------------------------------
      0            /usr/local/bin/python3.7   4         auto mode
    * 1            /usr/bin/python2.7         2         manual mode
      2            /usr/bin/python3.5         3         manual mode
      3            /usr/local/bin/python3.7   4         manual mode
    
    Press <enter> to keep the current choice[*], or type selection number: 1
    itaso@ubuntu:~$ 
    
    

    备注:注意 * 号的位置

    itaso@ubuntu:~$ sudo update-alternatives --config python
    有 3 个候选项可用于替换 python (提供 /usr/bin/python).
    
      选择    	   路径                       优先级    状态
    ------------------------------------------------------------
      0            /usr/local/bin/python3.7   4         自动模式
      1            /usr/bin/python2.7         2         手动模式
      2            /usr/bin/python3.5         3         手动模式
    * 3            /usr/local/bin/python3.7   4         手动模式
    
    要维持当前值[*]请按<回车键>,或者键入选择的编号: 1
    update-alternatives: using /usr/bin/python2.7 to provide /usr/bin/python (python) in manual mode
    itaso@ubuntu:~$ 
    

至此,以上是在自己搭建的虚拟机系统的真实输入日志,有效的提供了从 查看操作系统查看 update-alternatives 帮助手册添加多版本管理配置 以及最后的 版本切换 操作等常用需求

<think>我们参考了提供的四个引用,它们都涉及使用update-alternatives管理多个版本(主要是Java,也有Python)的方法。根据用户的问题,他特别想了解管理Java版本的方法。我们将结合引用内容,整理出使用update-alternatives管理Java版本的步骤和注意事项。 关键点: 1. 确保Java版本已经被添加到alternatives系统中(引用1和引用3)。 2. 使用`update-alternatives --config`命令来切换版本(引用1、引用2)。 3. 可以使用`--auto`模式设置自动选择优先级最高的版本(引用2)。 4. 添加Java版本到alternatives系统时,需要指定路径、名称、可执行文件路径以及优先级(引用3和引用4)。 步骤: 1. 添加Java版本到alternatives系统(如果尚未添加): 命令格式:`sudo update-alternatives --install <链接路径> <命令名称> <实际路径> <优先级>` 例如,添加一个Java版本的javac命令(引用3): sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-9-openjdk-amd64/bin/javac 3000 同样,可以添加java、javap等命令。 2. 查看已添加的Java版本: 查看java命令的版本列表:`update-alternatives --config java`(引用1) 也可以使用`update-alternatives --display java`查看更详细的信息,包括优先级(引用1)。 3. 切换Java版本: 手动切换:`sudo update-alternatives --config java`,然后从列表中选择一个版本(引用1)。 自动切换:设置命令为auto模式,这样系统会自动选择优先级最高的版本(引用2)。 例如:`sudo update-alternatives --auto java` 4. 确保相关命令都设置为auto模式,以便自动切换(引用2): 可以执行一系列命令,如: sudo update-alternatives --auto java sudo update-alternatives --auto javac ...(其他命令如javap, javah, jconsole, jshell等) 注意事项: - 不同的Java安装方式可能不会自动添加到alternatives系统,需要手动添加。 - 在添加命令时,优先级数值越大,表示优先级越高(引用4)。 - 切换时,如果希望自动选择优先级最高的版本,需要确保命令处于auto模式(引用2)。 示例:假设我们有两个Java版本,分别是OpenJDK 8和OpenJDK 11,路径分别为: OpenJDK 8: /usr/lib/jvm/java-8-openjdk-amd64 OpenJDK 11: /usr/lib/jvm/java-11-openjdk-amd64 首先,将它们添加到alternatives系统(如果尚未添加): sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-openjdk-amd64/bin/java 1000 sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk-amd64/bin/java 2000 然后,我们可以通过`update-alternatives --config java`手动选择,或者因为OpenJDK 11的优先级更高(2000>1000),在auto模式下会自动选择OpenJDK 11。 如果希望切换回OpenJDK 8,可以手动选择,或者将OpenJDK 8的优先级设置得比OpenJDK 11高(比如3000),然后重新设置为auto模式(`sudo update-alternatives --auto java`)就会自动选择OpenJDK 8。 因此,管理Java版本的主要方法是:添加多个版本到alternatives系统,然后通过配置(手动或自动)进行切换。 生成的相关问题: 1. 如何将Java安装添加到update-alternatives系统中? 2. 如何查看当前alternatives系统中已注册的Java版本? 3. 如何设置默认使用优先级最高的Java版本? 4. 如果切换后版本没有生效,可能的原因是什么? </think>### 使用 update-alternatives 管理 Java 版本的方法 在 Linux 系统中,`update-alternatives` 是管理多版本软件的标准工具。以下是管理 Java 版本的完整流程: --- #### 1. **添加 Java 版本到 alternatives 系统** 如果 Java 未自动注册(如手动安装),需手动添加: ```bash # 添加 java 命令 sudo update-alternatives --install /usr/bin/java java <Java路径>/bin/java <优先级> # 添加 javac 命令(JDK 需要) sudo update-alternatives --install /usr/bin/javac javac <Java路径>/bin/javac <优先级> ``` **参数说明**: - `<Java路径>`:如 `/usr/lib/jvm/jdk-11` - `<优先级>`:数值越高优先级越高(例如 `3000 > 2000`)[^3][^4] *示例*: ```bash sudo update-alternatives --install /usr/bin/java java /opt/jdk-17/bin/java 3000 ``` --- #### 2. **查看已注册版本** - 列出所有 Java 版本: ```bash update-alternatives --config java ``` 输出示例: ``` 选择项 路径 优先级 状态 ------------------------------------------------------------ * 0 /opt/jdk-11/bin/java 2000 自动模式 1 /opt/jdk-8/bin/java 1000 手动模式 2 /opt/jdk-17/bin/java 3000 手动模式 ``` (`*` 表示当前使用的版本)[^1] - 查看详细优先级信息: ```bash update-alternatives --display java ``` --- #### 3. **切换 Java 版本** - **手动切换**(交互式选择): ```bash sudo update-alternatives --config java ``` 根据提示输入选择项的编号(如 `2`)[^1] - **自动切换**(使用最高优先级版本): ```bash sudo update-alternatives --auto java sudo update-alternatives --auto javac # 同步设置 javac ``` 此操作后系统会自动选择优先级最高的版本[^2] --- #### 4. **关键注意事项** - **关联命令需同步设置**: JDK 需要同时设置 `java`, `javac`, `javap` 等命令的版本: ```bash sudo update-alternatives --auto java sudo update-alternatives --auto javac sudo update-alternatives --auto javap ... # 其他命令 ``` 避免出现 `java` 和 `javac` 版本不一致的问题[^2]。 - **优先级规则**: 在 `auto` 模式下,系统**始终选择优先级最高的版本**。[^2][^4] - **验证版本**: 切换后执行: ```bash java -version javac -version ``` --- #### 5. **故障排查** - **未生效的常见原因**: 1. Java 路径未正确注册到 `alternatives` 系统[^1] 2. 关联命令(如 `javac`)未同步切换[^2] 3. 环境变量 `JAVA_HOME` 未更新(需额外配置) - **修复命令**: 重新注册路径并设置 `auto` 模式(参考步骤 1 和 3)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值