Linux系统之美:环境变量的概念以及基本操作
本节重点
- 理解环境变量的基本概念
- 学会在指令和代码操作上查询更改环境变量
- 环境变量表的基本概念
- 父子进程间环境变量的继承与隔离
一、引入
1.1 自定义命令(我们的exe)
我们以往的Linux编程经验告诉我们,我们在对一段代码编译形成可执行文件后执行可执行文件必须声明可执行文件所在的路径,路径可以是相对路径也可以是绝对路径:
而如果我们不加上 ./ 也就是不加上可执行文件的完整路径,系统就会出现以下报错:
表示命令行解释器(bash)无法找到该命令的可执行文件和该命令的实现方法。
1.2系统命令的实现:
系统命令的实现与上述别无二致,其主要步骤如下:
a、开发者使用编程语言(如C、C++、Shell等)编写命令的源代码。源代码包含了实现命令功能的逻辑和算法。
b、使用编译器(如gcc)将源代码编译成目标文件(.o文件),然后将目标文件链接成可执行文件。在链接过程中,编译器会链接所需的库文件,确保命令能够正常运行。
c、将编译生成的可执行文件安装到系统的某个目录中,通常是/usr/bin
、/sbin
、/usr/sbin、/
等标准目录中。
所以系统命令本质上也是可执行文件,当我们在命令行输入系统命令如 ls 、cd、touch、mkdir时,bash(命令行解释器)会将命令进行解析检查命令是否合法,当合法时bash就会创建子进程来执行该命令。
对于系统命令来说,bash(命令行解释器)会自动在/usr/bin
、/sbin
、/usr/sbin、/bin
等标准目录中查找相应命令的可执行文件(也就是实现方法),找到之后执行可执行文件即可。
而对于我们“自定义的命令”也就是我们的可执行文件来讲,当我们输入可执行文件的文件名时bash也会自动在/usr/bin
、/sbin
、/usr/sbin、/bin
等标准目录中查找对应的可执行文件,结果当然是找不到所以就会报错(Command not found)。
1.3 引入环境变量
当我们登录Linux系统时bash进程就会被创建,同时bash进程会从系统文件中配置并维护一批环境变量来指定运行环境参数,其中 PATH 就是其中之一,其指定了/usr/bin、/sbin、/usr/sbin、/bin等标准目录:
当用户在命令行或脚本中输入一个命令或程序名时,操作系统会根据PATH环境变量的值去查找该命令或程序的可执行文件,如果找到了相应的可执行文件,操作系统就会执行它;如果没有找到,操作系统会报错,提示“命令无法识别”或类似的错误信息。
二、基本概念
在Linux系统中,环境变量是一种用于存储影响进程行为和运行的动态值的机制。环境变量是由操作系统或用户设置的,可以被系统和应用程序在运行时访问和使用。它们通常用于定义系统配置、路径设置、用户偏好等。
格式:
环境变量名 = 内容
如环境变量PATH:
一个环境变量可能会有多个内容(值),不同内容(值)之间用 :隔开。
在命令行界面我们可以使用 env 来查看所有环境变量以及内容:
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
三、获取环境变量
3.1 指令操作
1> env
功能:查看所有或特定的环境变量
#查看所有的环境变量
env
#查看特定的环境变量(如PATH)
env | grep PATH
示例:查看特定的环境变量HOME
2> export
功能:设置或者更改环境变量
设置一个环境变量:
export 变量名=内容
示例:设置一个新环境变量value
export value=/home/yjh/linux-learning
更改一个环境变量的内容(临时):
全部更改:
export 变量名=新内容
追加更改:
export $变量名=:新内容
示例:在环境变量PATH之后再追加一段路径/home/yjh/linux-learning
export $PATH:/home/yjh/linux-learning
3> echo
功能:查看环境变量的内容
echo $变量名
示例:查看环境变量PATH的内容
4> unset
功能:删除某一个环境变量
unset 变量名
示例:
3.2 代码操作
除了在命令行窗口用指令获取环境变量的内容,在代码之中我们也可以通过getenv等库函数获得对应环境变量的内容,以便于我们配置和管理运行时行为。
1> 通过父进程(bash等)获取
在理解这个概念之前我们需要明白的是main函数是什么,main函数的参数究竟有几个,main函数被谁调用这几个问题,下面我们对这些问题一一进行解答:
首先main函数是我们C程序的唯一入口点,操作系统会加载可执行文件,并寻找main函数作为执行的起点。在C语言中main函数有以下两种标准形式:
- int main( void )
- int main( int argc , char * argv[] )
第一种是我们常见的无参形式即不需要传递参数,第二种接受命令行参数,其中argv是一个字符串数组,而argc表示该数组中的元素个数,关于命令行参数的相关知识我们后续实现自定义shell(命令行解释器)时会给大家一一讲解。
其实在C标准中,main函数还支持第三个参数即环境变量表,所以C标准允许main函数所定义的形式为:
int main(int argc,char* argv[],char* env[])
{return 0;
}
其中env是一个指向环境变量字符串数组的指针,每个字符串格式为 NAME=value 。不过,这个参数在C标准中是可选的,不是所有实现都支持。例如,在Windows的某些编译器中,可能不支持env 参数,或者需要通过其他方式获取环境变量。
这里我们来写一个简单的代码打印验证一下我们通过main函数获取的环境变量:
#include<stdio.h>
int main(int argc,char* argv[],char* env[])
{(void)argc;(void)argv;for(int i=0;env[i];i++){//打印数组中的每一个元素printf("%s\n",env[i]); }printf("\n");return 0;
}
运行结果:
其中这个env字符串数组还有一个名字就是环境变量表。前面我们说过当我们登录Linux系统时系统就会给我们自动创建一个bash进程,之后我们进行的一系列命令,写的一系列代码运行起来都是bash的子进程,当我们的C程序进程被创建时bash就会调用一系列系统调用将环境变量传递给子进程形成一张环境变量表,子进程通过char* env[ ] 参数或全局变量 extern char** environ访问这些环境变量。
举个例子,当我们在bash中对环境变量进行一系列增删查改时,结果也可以在子进程(我们的C程序)中看到:
设置一组新环境变量:
export value1=123456
export value2=yjh
export value3=jzq
export value4=hello
此时再打印我们C程序中的环境变量表内容发现也可以看到新增环境变量:
2> getenv
getenv 是一个在C标准库(<stdlib.h>)中定义的用于获取环境变量值的函数
函数原型:
char *getenv(const char *name);
功能:接受一个字符串name表示要查询的环境变量的名称,成功返回 char* 类型指向该环境变量的指针(字符串),失败返回NULL(变量不存在或不可访问)。
底层原理:全局变量environ(extern char** environ)
上面我们说过,当我们的C程序的进程被创建时,bash就会通过调用系统调用将环境变量传递给子进程(我们的C程序),形成一张环境变量表而子进程可以通过参数env或者environ来接受,其中environ是一个指向环境变量表(字符串数组)的指针。
而getenv函数内部通过遍历environ查找匹配的变量名,并返回对应环境变量的内容。
示例:查询环境变量PATH的内容
#include<stdio.h>
#include<stdlib.h>int main()
{char* value=getenv("PATH");if(value==NULL){printf("getenv fail\n");}else{printf("PATH->%s\n",value);}return 0;
}
运行结果:
3> environ指针
在Linux系统中,environ是一个全局变量,指向环境变量字符串数组的指针。它允许程序直接访问系统环境变量(如PATH、HOME等)。
类型:extern char** environ(C语言中声明为全局变量)
内容:每个字符串格式为 name=value 例如:PATH=/usr/local/sbin
用途:程序可通过 environ 直接读取或修改环境变量
示例:
使用environ打印所有的环境变量:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
extern char** environ;
int main()
{for(char **env=environ;*env!=NULL;env++){printf("%s\n",*env);}return 0;
}
运行结果:
四、环境变量表
4.1 基本概念
在Linux系统中环境变量表实际上指的是存储环境变量的数据结构其本质上是一个字符串数组,它在程序启动时从父进程中被继承并在程序运行过程中可以被访问和修改。
4.2 环境变量表的产生
4.2.1 子进程中拷贝自父进程
在子进程中的环境变量表由父进程传递而来,也就是说当子进程被创建时父进程会拷贝一份自己的环境变量表传递给子进程,这里我们可以做一个小示例:
当我们在父进程(这里是bash)中对环境变量表进行一系列增删查改后,此时我们运行自己的C程序(创建bash的子进程)会发现子进程中的环境变量表也发生了改变。
在bash(父进程)设置一组新环境变量:
export value1=123456
export value2=yjh
export value3=jzq
export value4=hello
此时打印我们C程序(子进程)中的环境变量表内容发现也可以看到新增环境变量:
注意:子进程中修改环境变量表不会影响父进程
也就是说父子进程中的环境变量表都是独立的副本,子进程被创建时父进程会拷贝自己的环境变量表加载到子进程,而子进程对自己环境变量表的修改不会影响到父进程,只会影响当前的子进程及其后续创建的子进程。
4.2.2 父进程(bash)中来自系统配置
在前面我们了解到,子进程中的环境变量表由父进程中拷贝而来,而父进程(bash)中的环境变量表从何而来呢?答案是从系统配置文件而来。
在前面我们学习了一系列指令用于在命令行窗口中设置或更改环境变量,例如export和unset指令,但实际上这些操作都具有临时性,当我们退出系统并重新登录时,就会发现我们修改的结果并没有永久生效,系统会重新生成一份全新的默认的环境变量表:
在bash中新增一组环境变量:
export value1=123456
export value2=yjh
export value3=jzq
export value4=hello
此时我们可以看到新增后的结果:
当我们退出系统重新登录Linux后执行env会发现新增的一组环境变量不见了:
bash中的环境变量来源于系统级或者用户级配置文件如
~/.bashrc
、~/.bash_profile
等,export或unset指令并没有对系统配置文件进行修改所以其更改具有临时性,当我们再次登录时系统就会根据配置文件生成全新的默认的环境变量表。
五、总结
在这次学习中我们首先通过自定义可执行文件与系统指令运行时的差异上引出了环境变量的概念,之后我们了解了PATH环境变量的作用:命令行解释器(shell)通过PATH的内容遍历标准目录来查找相关指令的可执行文件,找到就运行文件找不到就报Command not found 等类似错误。
之后我们分别在指令操作与代码操作两个方面总结了查询或更改环境变量的指令与函数,在这里我们提到了环境变量的”继承性“与差异,即当子进程创建时父进程就会拷贝一份自己的环境变量表加载到子进程,而子进程对自己环境变量表的更改不会影响到父进程。
最后我们谈到了环境变量表的由来:即子进程中由父进程拷贝并加载而来,父进程(bash)中则来源于系统的配置文件。
相关文章:
Linux系统之美:环境变量的概念以及基本操作
本节重点 理解环境变量的基本概念学会在指令和代码操作上查询更改环境变量环境变量表的基本概念父子进程间环境变量的继承与隔离 一、引入 1.1 自定义命令(我们的exe) 我们以往的Linux编程经验告诉我们,我们在对一段代码编译形成可执行文件后…...
【nnUnetv2】推理+评估+测试
在 Windows 系统下设置环境变量 之前训练和推理的时候开着AutoDL的服务器,是在 Linux 系统下设置的环境变量。 但是现在开始研究具体代码了,就在本地跑(一直开着服务器有点费钱),所以就在Windows 系统下设置环境变量。 ①右键点击 “此电脑”,选择 “属性”。 ②在左侧…...
损失函数理解(一)——极大似然估计
本博客内容来自B站up主【王木头学科学】的视频内容 习惯看视频的小伙伴可移至视频链接[待补充]:~~~ 首先通俗地解释一下极大似然估计(Maximum Likelihood Estimation,MLE)的思想:通过结果寻找使该结果发生的最可能的原…...
ios端使用TCplayer直播播放三秒直接卡顿bug
1. 查看配置项没问题 setTcPlayer() {let that this;player new TcPlayer("videoPlayer", {live: this.activatPlayType "livePlay" ? true : false,x5_type: "h5",x5_fullscreen: true,systemFullscreen: true,x5_orientation: 1,x5_player…...
大模型-提示词工程与架构
什么是提示工程 提示工程(Prompt Engineering)是一门新兴的技术领域,专注于研究如何设计、构建和优化提示词,以充分发挥大模型的潜力 。它涉及到对语言结构、任务需求、模型特性等多方面因素的综合考量。提示工程的目标是通过精心…...
高斯数据库-WDR Snapshot生成性能报告
docker 安装高斯数据库: docker pull opengauss/opengauss:latestdocker run --name opengauss --privilegedtrue -d -e GS_PASSWORDopenGauss123 -p 8090:5432 -v /opengauss:/var/lib/opengauss/data opengauss/opengauss:latest 进入容器设置用户权限ÿ…...
损失函数理解(二)——交叉熵损失
损失函数的目的是为了定量描述不同模型(例如神经网络模型和人脑模型)的差异。 交叉熵,顾名思义,与熵有关,先把模型换成熵这么一个数值,然后用这个数值比较不同模型之间的差异。 为什么要做这一步转换&…...
CSS学习笔记
【1】CSS样式规则 【2】CSS样式表引入方式 1、行内式 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"/><meta name"vi…...
AI比人脑更强,因为被植入思维模型【15】马斯洛需求层次理论
马斯洛需求层次模型思维模型 定义 马斯洛需求层次模型是由美国心理学家亚伯拉罕马斯洛(Abraham Maslow)于1943年提出的一种心理学理论,用于描述人类动机的层次结构。该模型将人类的需求从低到高分为五个层次,分别是生理需求、安…...
cartographer中地图转换
文章目录 地图种类栅格地图 坐标系种类ros坐标系像素坐标系物理坐标系(世界坐标系) 地图种类 栅格地图 地图的初始化 在Cartographer中,栅格地图通过概率值来表示每个栅格的状态。每个栅格的初始概率值通常设置为0.5,表示未知状态。这种初始化方式允许…...
关于MTU的使用(TCP/IP网络下载慢可能与此有关)
参考链接:告诉你mtu值怎么设置才能网速最好! -Win7系统之家 出现网络速度被限制,可能与MTU值相关,先查看下本机的MTU winR,然后输入:netsh interface ipv4 show subinterfaces ,查看自己网络中的MTU&…...
【AI解题】Cache直接映射地址划分解析
一、问题背景 某32位总线处理器的Cache采用直接映射方式,已知 Cache总容量为16KB,每个Cache块大小为16字节。需要确定内存地址中 Offset(块内偏移)、Index(块索引)、Tag(标签) 三部…...
android音频概念解析
音频硬件接口(我们可以理解为ASOC的声卡) 官方代码里叫audio hardware interface 也称为module,定义在services/audiopolicy/config/audio_policy_configuration.xml: 分别有primary,a2dp,usb࿰…...
项目生命周期 和 项目管理生命周期的差异
在项目管理中,明确区分 项目生命周期 和 项目管理生命周期 是理解项目运作的关键。以下从定义、阶段划分到实际应用进行系统性分析: 一、项目生命周期(Project Life Cycle) 定义 项目生命周期是项目从 启动到结束 的自然演进过程,描述项目交付成果的 技术性阶段,通常与…...
UDP 协议
文章目录 UDP 协议简介数据包格式UDP 通信流程抓包分析参考 本文为笔者学习以太网对网上资料归纳整理所做的笔记,文末均附有参考链接,如侵权,请联系删除。 UDP 协议 UDP 是一种面向无连接的传输层协议,属于 TCP/IP 协议簇的一种。…...
[已解决]jupyter notebook报错 500 : Internal Server Error及notebook闪退
jupyter notebook出现如上图的报错,可以在黑色窗口中检查是为什么报错。 我检查发现是nbconvert导致的问题,卸载重装nbconvert。 但是这时候出现,jupyter notebook闪退问题。jupyter的黑色窗口出现一秒钟就没了。 在Anaconda Prompt中检查ju…...
APM 仿真遥控指南
地面站开发了一段时间了,由于没有硬件,所以一直在 APM 模拟器中验证。我们已经实现了 MAVLink 消息接收和解析,显示无人机状态,给无人机发送消息,实现一键起飞,飞往指定地点,降落,返…...
使用 ncurses 库创建文本用户界面:基础函数详解
简介 ncurses 是一个功能强大的库,用于在 Unix-like 系统中创建文本用户界面。它提供了丰富的函数来控制屏幕上的文本显示、处理键盘输入、绘制图形元素等。本文将详细介绍 ncurses 库中的一些基础函数,包括 printw、wrefresh、获取用户信息、键盘输入、…...
dify创建第一个Agent
1、首先LLM模型必须支持 Function Calling 由于deepseek-R1本地化部署时还不支持,所以使用 qwq模型。 2、创建空白 Agent 3、为Agent添加工具 4、测试 当未添加时间工具时 询问 时间 如下 5、开启时间工具 询问如下...
nebula graph传统使用Docker进行项目发版
nebula graph传统使用Docker进行项目发版 1. nebula graph服务2. 搭建ES集群3. 注意事项3.1 图数据库的启动顺序3.2 模糊查询失效 1. nebula graph服务 1.在测试服务器中执行如下命令 docker commit 85b6e2b8xxx xxx_nebula_es:1.0.0.2执行docker images之后能看到新的镜像 x…...
OpenCV vs MediaPipe:哪种方案更适合实时手势识别?
引言 手势识别是计算机视觉的重要应用,在人机交互(HCI)、增强现实(AR)、虚拟现实(VR)、智能家居控制、游戏等领域有广泛的应用。实现实时手势识别的技术方案主要有基于传统计算机视觉的方法&am…...
PRODIGY: “不折腾人”的蛋白-蛋白/蛋白-小分子结合能计算工具
PRODIGY(全称为 PROtein binDIng enerGY prediction)是一种蛋白质结合能预测工具,可利用蛋白质-蛋白质复合物的三维结构来预测其结合亲和力。PRODIGY 利用一种高效的基于接触的方法,在估计结合自由能和解离常数的同时,…...
IDEA修改默认作者名称
User: IDEA提示注释缺少author信息,但自动设置后,名称不是我想要的默认名称,应该如何修改IDEA里默认的作者名称? Kimi: 以下是几种修改IntelliJ IDEA中默认作者名称的方法: ### 方法一:修改File and Code …...
【嵌入式学习2】C语言 - VScode环境搭建
目录 ## 语言分类 ## c语言编译器 ## VScode相关配置 ## 语言分类 编译型语言:C,C解释型语言:python,JS ## c语言编译器 分类GCC 系列MinGWCygwinMSVC系列一套编程语言编译器将GCC编译器和GNU Binutils移植到Win32平台下的产物…...
【TI MSPM0】Timer学习
一、计数器 加法计数器:每进入一个脉冲,就加一减法计算器:每进入一个脉冲,就减一 当计数器减到0,触发中断 1.最短计时时间 当时钟周期为1khz时,最短计时时间为1ms,最长计时时间为65535ms 当时…...
SQL Server数据库慢SQL调优
SQL Server中慢SQL会显著降低系统性能并引发级联效应。首先,用户直接体验响应时间延长,核心业务操作(如交易处理、报表生成)效率下降,导致客户满意度降低甚至业务中断。其次,资源利用率失衡,CPU…...
大数据平台上的数据建模与分析:从数据到决策的跃迁
大数据平台上的数据建模与分析:从数据到决策的跃迁 随着数字化转型的深入,大数据平台成为了企业实现智能决策和创新的核心技术基础。大量结构化、半结构化和非结构化数据的生成和存储,促使企业需要更高效的方式来管理、分析、以及从中提取有价值的信息。在这一过程中,数据…...
C++ --- 多态
1 多态的概念 多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主要就是我…...
细说卫星导航:测距定位原理
测距定位原理 1. 伪距测量技术 核心原理:卫星发射信号,用户接收并记录传播时间,乘以光速得到距离(伪距)。 技术细节: 信号传播路径分析 信号结构: 卫星信号包含三部分: 载波&…...
【AI News | 20250322】每日AI进展
AI Repos 1、DeTikZify 可以把草图或图形转换成TikZ代码的模型,可用来绘制复杂的科学图表,输入草图或文字描述即可转换成TikZ代码。DeTikZify强大的地方在于它能理解图表的语义信息, 能识别图表中的不同组成部分及其含义,比如坐标…...
【js逆向入门】图灵爬虫练习平台 第九题
地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvOS8 f12进入了debugger,右击选择一律不在此处暂停, 点击继续执行 查看请求信息 查看载荷,2个加密参数,m和tt 查看启动器,打上断点 进来 往…...
重新复活的(手机端)一站式应用管理与下载平台
应用乐园(安卓) 应用乐园作者去年3月表示,由于精力问题,要停止维护奇妙搜索、应用乐园、奇妙影视这些软件了。 然而最近,令人意外的是,应用乐园竟然“复活”了!更准确地说,它进行了…...
AI密码学
嗯,用户给了一个需要破译的密码文档:“Uif qjh jt po uif usff.”,提示是用字母往前推移1的凯撒密码。首先,我得确认自己是否正确理解提示。凯撒密码通常是将字母按照一定位移来替换,这里的提示是往前推1位,…...
Python设计模式 - 适配器模式
定义 适配器模式(Adapter Pattern)是一种结构型设计模式,它用于将一个类的接口转换为客户端所期待的另一个接口。 注:在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者一组方法的集合。 结构 …...
S32K324 MCAL SPI波特率配置不对问题排查
文章目录 前言MCAL配置检查SPI时钟源问题处理总结 前言 项目开发过程中,MCAL SPI配置时发现实际配置的波特率和用逻辑分析仪采集的时钟频率对不上,实际的频率只有配置的一半,本文记录该问题的排查过程。 MCAL配置检查 MCAL SPI配置波特率在…...
STM32八股【2】-----ARM架构
1、架构包含哪几部分内容 寄存器处理模式流水线MMU指令集中断FPU总线架构 2、以STM32为例进行介绍 2.1 寄存器 寄存器名称作用R0-R3通用寄存器用于数据传递、计算及函数参数传递;R0 也用于存储函数返回值。R4-R12通用寄存器用于存储局部变量,减少频繁…...
Java 记忆链表,LinkedList 的升级版
文章目录 记忆链表 MemoryLinkedList实战源代码 众所周知,ArrayList 和 LinkedList 是 Java 集合中两个基本的数据结构,对应数据结构理论中的数组和链表。但在这两个数据结构,开发者们通常使用 ArrayList,而不使用 LinkedList。JD…...
浔川社团官方联合会维权成功
在2025.3.2日,我社团检测文章侵权中,检测出3篇文章疑似遭侵权,随后,总社团联合会立即联系CSDN版权,经过17天的维权,至今日晚,我社团维权成功!侵权文章全部被设置为转载。 在此&…...
asp.net core mvc模块化开发
razor类库 新建PluginController using Microsoft.AspNetCore.Mvc;namespace RazorClassLibrary1.Controllers {public class PluginController : Controller{public IActionResult Index(){return View();}} }Views下Plugin下新建Index.cshtml {ViewBag.Title "插件页…...
Linux——线程
Linux——线程 目录 一、线程 1.1 创建一个线程 1.2 主函数等待线程结束pthread_join 为什么输出是乱序的 一、线程 线程:进程内部的一条执行路径 进程:一个正在运行的程序 进程相当于工厂车间,线程就是车间里的许多工人 1.1 创建一个…...
dubbo异步调用
Dubbo 异步调用分为 Provider 端异步调用和 Consumer 端异步两种模式。 Consumer 端异步是指发起 RPC 调用后立即返回,调用线程继续处理其他业务逻辑,当响应结果返回后通过回调函数通知消费端结果。Provider 端异步执行将阻塞的业务从 Dubbo 内部线程池…...
2025知识图谱峰会(脱敏)PPT合集(18份).zip
2025知识图谱峰会(脱敏)PPT合集,共18份。 一、GraphRAG:核心技术与应用 1、多模态GraphRAG初探:文档智能知识图谱大模型结合范式.pdf 2、GraphRAG在CVTE多业务场景下的探索与应用.pdf 二、企业知识管理智能化升级&am…...
Android Studio最后一个绑定JDK8的版本,但是官方下载是最新的,怎么下载Android Studio历史版本包,这篇文章帮你解决。
最近需要安装Android Studio 编辑器 发现官网最新的编辑器已经不支持 jdk8了 经过查阅资料: Android Studio最后一个绑定JDK8的版本:4.1.3 下载地址:https://developer.android.google.cn/studio/archive 如果你打开是这样的 下载页 这是因为你用的中…...
如果我没安装office,只安装了wps,python 如何通过win32com.client.Dispatch操作ppt?
文章目录 win32com.client.Dispatch是干嘛的?什么是Windows COM组件COM和dll有关系吗?python 如何通过win32com.client.Dispatch操作ppt?如果我没安装office,只安装了wps,python 如何通过win32com.client.Dispatch操作ppt?附录:完整报错信息win32com.client.Dispatch是干…...
VSCode扩展工具Copilot MCP使用教程【MCP】
MCP(Model Context Protocol,模型上下文协议) ,2024年11月底,由 Anthropic 推出的一种开放标准,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信协议。本文章教你使用VSCode…...
什么是PHP伪协议
PHP伪协议是一种特殊的URL格式,允许开发者以不同于传统文件路径访问和操作资源。以下是一些常见的PHP伪协议及其详细介绍: 常见的PHP伪协议 1. **file://** - **用途**:访问本地文件系统。 - **示例**:file:///path/to/file.txt。…...
linux中如何修改文件的权限和拥有者所属组
目录标题 chmod指令八进制形式权限修改文件拥有者所属组的修改umask有关内容 chmod指令 chmod指令可以用来修改人员的权限其形式如下: u代表的是拥有者,g代表的是所属组,o代表的是其他人,a表示所有人,如果你想增加权…...
[项目]基于FreeRTOS的STM32四轴飞行器: 十一.MPU6050配置与读取
基于FreeRTOS的STM32四轴飞行器: 十一.MPU6050 一.芯片介绍二.配置I2C三.编写驱动四.读取任务的测试 一.芯片介绍 芯片应该放置在PCB中间,X Y轴原点,敏感度131表示范围越小越灵敏。理想状态放置在地面上X,Y,Z轴为0,即…...
音频录制小妙招-自制工具-借助浏览器录一段单声道16000采样率wav格式音频
先看效果 1、打开页面 2、点击开始录音,弹出权限提示,点击“仅这次访问时允许” 3、录完后,点击停止 4、文件自动下载到默认目录 上代码 js 部分 document.addEventListener(DOMContentLoaded, () > {const startBtn document.getEleme…...
【计算机网络原理】选择题+简答题
文章目录 选择题网络基础IP网络拓扑 OSI七层模型协议HDLCTCP/IP 交换技术网络安全数字签名 算法与策略 简答题UDPTCP 选择题 网络基础 下列域名中,属于国际顶级域名的是() A. us B. tom C. edu D. int 下列关于光纤传输介质的叙述中错误的是…...