【ubuntu软件版本管理】利用update-alternatives管理ubuntu软件

​ 我们有的时候希望在安装了新软件之后保留旧版本的软件,比如希望保留旧版本的gcc,以防以前写的C++编译出问题,这时候就需要版本管理软件update-alternatives。

​ 在此之前我们需要先弄清楚,什么是ubuntu的软件?拿C++源码编译的来说,其实就是编译后得到的【可执行文件(没有后缀的那个东西)+它所依赖的库(.a或者.so结尾)】,如下图的QQ-linux
请添加图片描述

系统软件的可执行文件放在【/usr/bin】下面(通过apt-get安装的),库放在【/usr/lib下面】,如下图
请添加图片描述

第三方安装的软件一般建议放在【/opt/】下面(如下图1)(通过编译源码安装的,编译安装的时候可以通过--prefix=路径名后缀选安装路径(如下图2),一般都建议安装在/opt/下面,方便与系统软件区分开来,不选的话会安装在/usr/local下面),第三方安装的软件有的结构比较规整(下图3),有的比较混乱(下图4),但是都包含可执行文件以及库文件

请添加图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

​ 系统在执行软件的时候是怎么操作的呢?我们这里只讨论在终端中执行软件的操作。编译过C++文件的人都知道,如果在cmakelist中设置了可执行目标的话,最后会编译出一个可执行文件(下图1),当终端在可执行文件同级目录的时候,就可以通过文件名进行执行(下图2)。那么为什么对于cmake、gcc这种软件,我们无论在哪里都可以执行呢?那是因为这些系统软件的可执行文件目录/usr/bin已经被包含在系统环境变量PATH中了(下图3),当我们执行软件的时候,系统会自动在PATH包含的路径中去找同名的可执行文件,就拿刚才图1中的test来说,如果我们把~/build/加入PATH环境变量(通过export PATH=~/test/build:$PATH实现),无论在哪里我们都可以执行my_test了(下图4)。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

​ 那么怎么进行软件版本管理呢?在刚才的讨论中,我们已经知道了执行软件是通过运行可执行文件的方式(比如通过./my_test运行my_test),那么我们就先来看看可执行文件,不妨看看/usr/bin下的可执行文件(下图1)。我们会发现,好奇怪,为什么有的可执行文件下面会有一个箭头(下图2),那是因为这个文件不是一个真正占内存的文件,而是一个软连接(跟windows里面的快捷方式差不多),它实际上指向了别的可执行文件(下图3)。这时候就可以想到,如果把某个软连接的指向修改掉,让它指向新版本的可执行文件,是不是就可以实现软件版本的切换了呢。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
​ 这时候终于可以请出我们的update-alternatives了,它的作用就是修改软连接的指向。拿cmake举例,这里我已经安装了两个cmake,一个是系统自带的cmake-3.16.3(在/usr/bin下,如下图1,它本来的名字是cmake,这里我改了名,方便后续操作),一个是自己安装的cmake-3.28.0(在/opt下,如下图2),利用如下命令就可以使/usr/bin/cmake指向/usr/bin/cmake-3.16.3或者/opt/cmake-3.28.0/bin/cmake了:

在这里插入图片描述
在这里插入图片描述

sudo update-alternatives --install /usr/bin/cmake  cmake /usr/bin/cmake-3.16.3  90
sudo update-alternatives --install /usr/bin/cmake  cmake /opt/cmake-3.28.0/bin/cmake  100

执行完这个操作后,可以用sudo update-alternatives --config cmake进行版本切换(下图1),这里版本切换的作用就是修改可执行文件软连接的指向。用ls -n /usr/bin/cmake可以看到/usr/bin/cmake指向/etc/alternatives/cmake,然后当我们切换到cmake-3.28.0的时候可以看到/etc/alternatives/cmake指向/opt/cmake-3.28.0/bin/cmake(下图2),当我们切换到cmake-3.16.3可以看到/etc/alternatives/cmake指向/usr/bin/cmake-3.16.3(下图2)。至此我们就用update-alternatives实现了软件版本管理。

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/682640.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务开发与实战Day02 - Docker

一、Docker快速入门 快速构建、运行、管理应用的工具 安装部署教程:Docs 1. 部署MySQL 测试连接: 镜像和容器 当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身&#xff…

Go微服务: 基于rocketmq:5.2.0搭建RocketMQ环境,以及示例参考

概述 参考最新官方文档:https://rocketmq.apache.org/zh/docs/quickStart/03quickstartWithDockercompose以及:https://rocketmq.apache.org/zh/docs/deploymentOperations/04Dashboard综合以上两个文档来搭建环境 搭建RocketMQ环境 1 ) 基于 docker-c…

RTOS笔记--任务状态与调度

任务状态 freertos中的任务分为四个状态:就绪状态(ready)、运行状态(running)、阻塞状态(blocked)、暂停状态(suspended) 完整的任务状态转换图: 在使用vTas…

04--Tomcat

前言:本章整理tomcat的知识点,tomcat知识点相较nginx比较少,但是也是运维必会的软件,这里结合实际项目整理一下。 1、tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器&#x…

在线建站流程分析

建站流程是指通过互联网创建一个个人或企业网站的过程。随着互联网的发展,越来越多的人和机构开始意识到网络的重要性,建站成为一种常见的行为。在线建站的流程一般包括以下几个步骤。 首先,选择一个合适的建站平台。目前,有很多在…

英伟达Docker 安装与GPu镜像拉取

获取nvidia_docker压缩包nvidia_docker.tgz将压缩包上传至服务器指定目录解压nvidia_docker.tgz压缩包 tar -zxvf 压缩包执行rpm安装命令: #查看指定rpm包安装情况 rpm -qa | grep libstdc #查看指定rpm包下的依赖包的版本情况 strings /lib64/libstdc |grep GLI…

这才是大模型价格战背后的真相

想必大家今天肯定被各家大模型厂商的降价新闻刷圈了,如果说 Meta Llama 3 的开源是国外大模型市场的搅局者,那 DeepSeek-V2 就是国内大模型市场的鲶鱼,但是价格战背后是大模型基础设施优化带来的物美价廉,还是浑水摸鱼的噱头&…

数据结构——(java版)包装类与泛型

文章目录 一 包装类1.1 包装类的概念1.2 装箱/装包1.3 拆箱/拆包1.4 一个面试题: 二 泛型2.1 什么是泛型?2.2 泛型的使用2.3 泛型的上界2.4 泛型实现Comparable接口2.5 擦除机制另外: 一 包装类 1.1 包装类的概念 在java中基本数据类型并不…

中国自动气象站:现代气象观测的中流砥柱

引言 气象观测是人类认识和预报天气的重要手段。在现代科技的推动下,自动气象站成为气象观测的重要工具,为天气预报、防灾减灾和气候研究提供了宝贵的数据支持。本文将介绍中国自动气象站的发展历程、技术特点及其在气象观测中的重要作用。 中国自动气象…

【Linux】信号(一)

信号我们将从信号产生,信号的保存,信号处理分别进行讲解~ 至少大思路是这样。开始之前还要进行一些基础知识的铺垫。 目录 从生活中提炼一些结论:信号概念的一些储备:信号产生:一、kill指令:二、键盘组合键…

BP 客户主数据-国际贸易条款发生更改

Issue :ECC升级S4后 1)客户主数据扩产线时(LHGX03),国贸条件2变更记录查询时,所扩产线(30 1C)无变更记录,未变更产线(10 1C/1H/1M)确认变更记录 20230108新增&#xff1…

生命在于学习——Python人工智能原理(3.2)

三、深度学习 (二)人工神经网络 人工神经网络是模仿人类大脑神经系统工作原理所创建的数学模型,有并行的分布处理能力、高容错性和自我学习等特征。 1、感知器 感知器由Frank Roseblatt于1957年提出,是一种广泛使用的线性分类…

Matlab解决矩阵微分方程建模(代码开源)

#用matlab解决施密特正交规范化矩阵之后,我又想到矩阵的微分方程计算量真的太大了,来回转化让我头大,于是我尝试了一下用matlab建立模型来解决这类问题。 代码部分如下:注解还挺清晰的: %%%解微分方程组%eg&#xff…

多目标优化-NSGA-II

文章目录 一、前置知识NSGA-II帕累托前沿 二、算法流程1.NSGA2.NSGA-II 一、前置知识 1.NSGA(非支配排序遗传算法):旨在同时优化多个冲突的目标函数,寻找帕累托前沿上的解集。 什么是多个冲突的目标: 比如你看上了一辆车,你既想要它便宜,又…

一个思维狂赚20万+?揭秘电商平台隐藏的流量认知!

你想要的流量,资源,人脉,都已经有人为你准备,你只需要找到拥有这些资源的人。对于流量和信息,也是一样,你想找的客户和产品,都已经有人为你准备在淘宝、拼多多等电商平台,你只需要找…

掌握Postman,轻松调试POST与GET接口:详细安装与实战教程,让你的API测试更高效

0.前言 在确保数据接口的稳定性和可访问性方面,使用专业的接口测试工具至关重要。这些工具不仅简化了测试流程,还提供了无需编写额外代码即可轻松调用和调试接口的能力,从而大大提高了测试效率和准确性。 0.1 Postman 背景介绍 用户在开发或…

遭遇Device Association Service占用CPU和内存过高异常

1.异常描述 在蓝牙设备搜索和配对过后,系统界面卡住了,查找了下任务管理器,发现有一个主机服务占用了过多的CPU和内存,且不断的在增长。截图如下: 百度查了下,Device Association Service是一个Win10系统服…

HCIP-Datacom-ARST自选题库_10_多种协议多选【24道题】

1.如图所示,PE1和PE2之间通过LoopbackO接口建立MP-BGP邻居关系,在配完成之后,发现CE1和CE2之间无法互相学习路由,下列哪些选项会造成该问题的出现? PE1或PE2未在BGP-VPNV4单播地址族视图使能邻居A PE1或PE2上的VPN实例参数配置错…

JVM的内存结构

JVM 内存结构 方法区: 方法区主要用于存储虚拟机加载的类信息、常量、静态变量,以及编译器编译后的代码等数据。 程序计数器 由于在JVM中,多线程是通过线程轮流切换来获得CPU执行时间的,因此,在任一具体时刻,一个CP…

2.1.3 采用接口方式使用MyBatis

实战概述:使用MyBatis的接口方式进行数据库操作 环境准备 确保项目中已经集成了MyBatis框架。 创建用户映射器接口 在net.huawei.mybatis.mapper包中创建UserMapper接口。定义方法findById(int id)用于按编号查询用户。定义方法findAll()用于查询全部用户。定义方法…