Linux_环境变量

目录

1、查询所有环境变量

2、常见的环境变量

2.1 PATH 

2.2 HOME

2.3 PWD 

3、增加新的环境变量

4、删除环境变量

5、main函数的三个形参 

5.1 argv字符串数组 

5.2 env字符串数组

6、系统调用接口 

6.1 getenv

6.2 putenv 

7、全局变量environ

结语 


前言:

        环境变量指的是在操作系统进行运行时,总是需要根据某些已经被加载好的参数进行运行的,因为操作系统运行也是得有“依据”的,而他的依据就叫做环境变量。

1、查询所有环境变量

        在Linux下可以使用指令env来查询Linux下所有的环境变量,操作如下(节选部分截图):

2、常见的环境变量

2.1 PATH 

        当输入一个指令时,该指令之所以可以被系统调用,原因就是系统会默认到PATH中去寻找这个指令存在哪个目录,没错,PATH实际上就是一串路径,只有在这些路径下的指令才可以被正常的执行,比如ls、cd这些指令的路径是/usr/bin,而PATH中包括/usr/bin,测试如下:

        注意:若要观察环境变量中的具体内容,则使用echo + $要查看的环境变量。 因此也可以解释当运行一个可执行程序时,需要带./才能运行,就是因为自己写的可执行程序的路径不在PATH中,所以需要带./指明该可执行程序的路径,否则系统找不到该程序在哪也就无法执行该程序了。

2.2 HOME

        登录的用户有普通用户和root用户,系统之所以可以将两者区分开了,就是因为HOME环境变量的存在,因为有了环境变量home,所以每次登录不同的用户时,系统会自动识别HOME的位置,然后分在对应的目录下。 

        查看HOME的内容:

        可以发现切换不同的用户导致HOME的内容不一样,换句话说,实际上是因为HOME的内容不一样导致所登录的用户不一样。 

2.3 PWD 

        指令pwd可以获取当前路径,实际上pwd就是调用了环境变量PWD,所以可以直接从PWD得到当前路径。

3、增加新的环境变量

        用export envname(表示要增加的环境变量),可以新增环境变量,并且可以用env看到该环境变量。测试如下:

4、删除环境变量

        对应的,也可以使用指令unset envname(表示要删除的环境变量)来删除环境变量,并且用env看不到被删除的环境变量了。测试如下:

5、main函数的三个形参 

        main函数的形参用的是非常少的,因为main函数形参的具体作用是打印出来命令行的信息和环境变量的信息,所以在正常的代码编写中几乎用不到该形参内容,不过可以确定的是main函数可以打印出所以环境变量的信息。

        main函数的三个参数:

int main(int argc, char *argv[], char* env[])
//argv存放命令行参数的字符指针
//env存放环境变量的字符指针

5.1 argv字符串数组 

        在了解如何在main函数中打印环境变量前,前了解main函数的第二个参数的含义,char* argv[],他是一个指针数组,里面保存的是char*类型的元素,而每一个char*元素指向的是在命令行运行该程序时所输入的指令(即命令行参数),只不过指令被当成字符串并把该字符串的首地址存放到了argv中。(argc表示argv里的元素个数

        打印命令行参数的测试代码如下:

  1 #include<stdio.h>2 3 int main(int argc,char* argv[])4 {5     int i = 0;6     for(;i<argc;i++)7         printf("argv[%d]:%s\n",i,argv[i]);                                                                                                                          8     return 0;9 }

         测试结果:

        从结果可以发现的确可以在main函数内打印外部的运行指令以及选项。 

5.2 env字符串数组

        env也是一个字符串数组,他所保存的是环境变量的内容,只不过是以字符串的形式在该数组中呈现,并且该数组的最后一个元素默认为NULL,依然可以通过上述打印命令行的方式打印出环境变量的内容。

        打印环境变量的测试代码如下:

    1 #include<stdio.h>2 3 int main(int argc,char* argv[],char* env[])4 {8     int i = 0;9     for(;env[i];i++)//因为env的最后一个元素为NULL,所以可以直接用其作为循环条件10         printf("env[%d]:%s\n",i,env[i]);                                                                                                                          11     return 0;                                                                                                                                    12 } 

        测试结果(部分截图): 

        那么为何main函数可以打印上述信息呢?因为运行程序时不只是单单的把该程序加载到内存中(进程概念),操作系统还会把这两张表(argv和env)的内容通过调用main函数的方式传给main函数,而操作系统本身在启动的时候会从配置文件中读取环境变量表,然后会一代一代的传给他的子进程及后代。

6、系统调用接口 

        上文说到可以用指令的方式获取环境变量,然而还可以在代码中采用调用接口的方式获取环境变量,以及调用接口添加环境变量,使用最多的两个系统接口是getenv和putenv。

6.1 getenv

        顾名思义就是得到一个环境变量的内容,可以通过Linux下的man手册得知该接口的用法: 

        该接口的实参是一个字符串,表示我们需要获得环境变量的名称,返回也是一个字符串,即表示环境变量的内容。

        测试接口代码如下: 

  1 #include<stdio.h>2 #include<stdlib.h>3 4 int main()5 {6     printf("PATH: %s\n",getenv("PATH")); //获取PATH的内容                                                                                                                         7     return 0;8 }

        运行结果:

        从结果可以发现,getenv一样可以获取环境变量的内容。 

6.2 putenv 

        putenv可以添加环境变量,他的作用和指令export相似,他的用法:

        并且添加成功时返回0,若添加失败则返回非零,但是值得注意的是putenv只是把添加的环境变量加载到main函数中的env字符串数组中,所以导致的是只能在该进程下看到添加的环境变量,而在别的进程下是看不到的

7、全局变量environ

         environ是一个二级指针,他指向环境变量表也就是env字符串数组,他的用法可以在man手册中查到。

        因此在使用environ时,需要用extern来声明。

        environ的测试代码如下:

  1 #include<stdio.h>2 #include<stdlib.h>3 #include<unistd.h>4 5 int main()//注意main函数中没有参数                                                                                                                                                   6 {7     extern char** environ;11     int i = 0;12     for(;environ[i];i++)//依靠environ打印环境变量表13         printf("environ[%d]:%s\n",i,environ[i]);14     return 0;15 }

        测试结果(节选部分截图):

结语 

        以上就是关于环境变量的讲解,环境变量是操作系统正常运行的前提,在开机的同时操作系统会自动向配置文件中读取环境变量。

        最后希望本文可以给你带来更多的收获,如果本文对你起到了帮助,希望可以动动小指头帮忙点赞👍+关注😎+收藏👌!如果有遗漏或者有误的地方欢迎大家在评论区补充,谢谢大家!! 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot + kotlin 协程小记

前言&#xff1a; Kotlin 协程是基于 Coroutine 实现的&#xff0c;其设计目的是简化异步编程。协程提供了一种方式&#xff0c;可以在一个线程上写起来像是在多个线程中执行。 协程的基本概念&#xff1a; 协程是轻量级的&#xff0c;不会创建新的线程。 协程会挂起当前的协…

中颖51芯片学习9. PWM(12bit脉冲宽度调制)

中颖51芯片学习9. PWM&#xff08;12bit脉冲宽度调制&#xff09; 一、资源简介二、PWM工作流程三、寄存器介绍1. PWMx控制寄存器PWMxCON2. PWM0周期寄存器PWM0PH/L3. PWM1周期寄存器PWM1PH/L4. PWM0占空比控制寄存器PWM0DH/L5. PWM1占空比控制寄存器 PWM1DH/L6. 占空比寄存器与…

跨语言指令调优深度探索

目录 I. 介绍II. 方法与数据III. 结果与讨论1. 跨语言迁移能力2. 问题的识别3. 提高跨语言表现的可能方向 IV. 结论V. 参考文献 I. 介绍 在大型语言模型的领域&#xff0c;英文数据由于其广泛的可用性和普遍性&#xff0c;经常被用作训练模型的主要语料。尽管这些模型可能在英…

ESLlint重大更新后,使用旧版ESLint搭配Prettier的配置方式

概要 就在前几天&#xff0c;ESLint迎来了一次重大更新&#xff0c;9.0.0版本&#xff0c;根据官方文档介绍&#xff0c;使用新版的先决条件是Node.js版本必须是18.18.0、20.9.0&#xff0c;或者是>21.1.0的版本&#xff0c;新版ESLint将不再直接支持以下旧版配置(非扁平化…

二、OSPF协议基础

基于SPF算法&#xff08;Dijkstra算法&#xff09;的链路状态路由协议OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09; 目录 1.RIP在大型网络中部署所面临的问题 2.Router ID 3.OSPF的报文 4.OSPF邻居建立过程 5.OSPF报文的确认机制…

SAP的生成式AI

这是一篇openSAP中关于SAP生成式AI课程的笔记,原地址https://open.sap.com/courses/genai1/ 文章目录 Unit 1: Approaches to artificial intelligence概念三种范式监督学习非监督学习强化学习Unit 2: Introduction to generative AI生成式AI基础模型关系基础模型有哪些能力呢…

怎么通过isinstance(Obj,Class)验证?【isinstance】

最近有这样一个项目&#xff0c;这个项目可以用一个成熟的项目的构造树&#xff0c;读取树&#xff0c;再检索的过程&#xff0c;现在有新的需求&#xff0c;另一个逻辑构造同样节点结构的树&#xff0c;pickle序列化保存&#xff0c;再使用原来项目的读取、检索函数&#xff0…

一年期免费SSL证书申请方法

免费SSL证书的申请已经成为当今互联网安全实践中的重要环节&#xff0c;它不仅有助于保护网站数据传输的隐私性和完整性&#xff0c;还能提升用户信任度&#xff0c;因为现代浏览器会明确标识出未使用HTTPS&#xff08;即未部署SSL证书&#xff09;的网站为“不安全”。以下是一…

互联网安全面临的全新挑战

前言 当前移动互联网安全形势严峻&#xff0c;移动智能终端漏洞居高不下、修复缓慢&#xff0c;移动互联网恶意程序持续增长&#xff0c;同时影响个人和企业安全。与此同时&#xff0c;根据政策形势移动互联网安全监管重心从事前向事中事后转移&#xff0c;需加强网络安全态势感…

玩转必应bing国内广告投放,正确的攻略方式!

搜索引擎广告作为精准触达潜在客户的重要渠道&#xff0c;一直是众多企业营销策略中的关键一环&#xff0c;在国内市场&#xff0c;虽然百度占据主导地位&#xff0c;但必应Bing凭借其独特的用户群体、高质量的搜索体验以及与微软生态的紧密集成&#xff0c;为广告主提供了不可…

相关运算及实现

本文介绍相关运算及实现。 相关运算在相关检测及数字锁相放大中经常用到&#xff0c;其与卷积运算又有一定的联系&#xff0c;本文简要介绍其基本运算及与卷积运算的联系&#xff0c;并给出实现。 1.定义 这里以长度为N的离散时间序列x(n),y(n)为例&#xff0c;相关运算定义如…

nvm管理多个node版本,快速来回切换node版本

前言 文章基于 windows环境 使用nvm安装多版本nodejs。 最近公司有的项目比较老需要降低node版本才能运行&#xff0c;由于来回进行卸载不同版本的node比较麻烦&#xff1b;所以需要使用node工程多版本管理&#xff0c;后面自己就简单捯饬了一下nvm来管理node&#xff0c;顺便…

VTK----VTK数据结构详解2(计算机篇)

在VTK中&#xff0c;属性数据和点都用数据数组&#xff08;data arrays&#xff09;表示。某些属性数据&#xff08;例如法线、张量&#xff09;需要具有与其定义一致的元组&#xff08;在计算机编程中&#xff0c;元组&#xff08;tuple&#xff09;用来表示存储多种数据类型的…

vue下载文件时显示进度条

1.单个下载&#xff08;开始是导出按钮 下载显示进度条&#xff09; html <el-button click.stop"exportReport(scope.row, scope.index)" v-if"!scope.row.schedule" icon"el-icon-download"size"small" type"text"styl…

cocos-lua资源管理

本文介绍cocos-lua项目的资源管理和工作流&#xff0c;适用人群包括初学者和有经验开发者&#xff0c;故读者可根据自己的需要有选择性的查阅自己需要的内容 一.简单案例解析 下文通过介绍一个简单demo&#xff0c;介绍合图和资源目录结构 1.1 运行效果 1.2 ccs结构 1.3 目录…

【Python-Spark(大规模数据)】

Python-Spark&#xff08;大规模数据&#xff09; ■ Spark■ PySparl编程模型■ 基础准备■ 数据输入■ RDD的map成员方法的使用■ RDD的flatMap成员方法的使用■ RDD的reduceByKey成员方法的使用■ 单词计数统计■ RDD的filter成员方法的使用■ RDD的distinct成员方法的使用■…

LANGUAGE-DRIVEN SEMANTIC SEGMENTATION

环境不易满足&#xff0c;不建议复现

详解js中的console对象

对于前端开发而言&#xff0c;console对象大家肯定都很熟悉&#xff0c;最常用的 console.log() 是开发调试必用的 但是对于console对象的其他方法&#xff0c;相对而言使用的就比较少了。下面详细介绍一下&#xff1a; 谷歌浏览器输出console对象&#xff1a; 值得一提的是不…

JAVA MQTT 发布主题请求,订阅主题接收,订阅主题回复,发布主题再接收回复,三步走

先看效果 一、准备工作 1.官网下载emqx压缩包放到自己的盘符下&#xff0c;不要带中文路径 下载 EMQX 2.在路径的bin中&#xff0c;cmd&#xff0c;启动emqx服务 emqx start 3.访问服务&#xff0c;能打开就证明启动成功&#xff0c;登录的话官网默认的密码账号&#xff08;…

【C#】Stopwatch计时器

使用Stopwatch检查C#中代码块的执行时间&#xff0c;比如歌曲&#xff0c;图片的下载时间问题 首先&#xff0c;我们可看到Stopwatch 类内部的函数。 根据需求&#xff0c;我们具体可使用到 Start() 开始计时&#xff0c;Stop() 停止计时等 //创建 Stopwatch 实例 Stopwatch …