LINUX系统编程之——环境变量

目录

环境变量

1、基本概念

2、查看环境变量的方法

三、查看PATH环境变量的內容

1)不带路径也能运行的自己的程序

a、将自己的程序直接添加到PATH指定的路径下

b、将程序所在的路径添加到PATH环境中

四、环境变量与本地变量

1、本地变量创建

2、环境变量创建 

3、其他环境变量 

五、C、C++中main()函数中的参数

1、agrc和argv

1)简易计算器的实现

2、主函数main的第三个参数

六、获取环境变量的方法

1、通过main函数的第三个参数

2、通过environ变量获取

3、通过调用接口getenv( )

​编辑 

4、获取环境变量的作用 

七、环境变量具有全局性 


环境变量

1、基本概念

环境变量这个词相信我们已经听过好多次了,但是到底什么是环境变量呢?试想我们在Linux命令行中输入指令的时候,如我们在不同的目录或者文件夹下输入ls、pwd、cd等等命令的时候,我们并没有带路径的名称,但是系统仍然给出了我们正确的反馈,那么系统是怎么知道我们这个时候是在哪个路径下呢?而我们在执行自己的程序的时候往往需要带上路径才能执行官,否则就会报错。这一切都与环境变量中的PATH变量有关。

所以来说,环境变量就是在操作系统中用来指定操作系统运行环境的一些参数。

  • 对于操作系统中可以直接在命令行使用、不需要指定路径的这些指令(程序), 因为他们的路径已经被添加到了操作系统的环境变量中 。
  • 当在操作系统的命令行不指定路径输入指令的时候, 操作系统会自动地在PATH环境变量 设置的路径中搜索是否存在与指令相匹配的程序。如果可以找到那就执行, 如果找不到, 那就会提示 command not found

2、查看环境变量的方法

  •  env:查看系统中所有环境变量

可以看到服务器上的环境变量还是不少的,但是我们只对PATH环境变量做介绍。

  • 我们可以用env|grep PATH很快找到PATH环境变量

三、查看PATH环境变量的內容

我们可以使用echo $NAME 的方法查看,NAME是环境变量的名称。

Tips:echo命令的主要作用是用于在终端输出文本,且echo最后是一个子进程。

可以看到, PATH中设置的路径有很多:/usr/local/bin /usr/bin /home/July/bin /usr/local/sbin …… 并且, 每个路径之间用 : 分隔,然后我们 就以 /usr/bin 路径为例:

当你进入这个路径, 并执行 ls指令的时候, 你会发现这个路径下有非常多的可执行程序:(只截取一小部分)

在这个路径下的这些命令就是那些像ls、pwd、cd似的不需要添加路径便能自己执行的命令。

1)不带路径也能运行的自己的程序

上面我们知道了凡是在PATH的路径下的命令在运行的时候都不需要添加路径,那么我们能否将自己写的程序添加进这个路径下呢?此时自己的程序再执行的时候是不是也和这些命令一样不需要加路径了呢?

a、将自己的程序直接添加到PATH指定的路径下

但是这种方法有一定的风险,可能会出现自己的程序名和系统自己的某个路径下的程序重名的情况。

Tips:测试完之后可以使用sudo rm -f /usr/bin/程序名的指令删除掉添加的命令。 

b、将程序所在的路径添加到PATH环境中
  • 首先,查看可执行程序当前所处的路径,pwd
  • PATH=$PATH:新路径 
  • 运行程序

但是这里还要强调几点: 

  • export也可以设置环境变量,但是不能用export PATH=新路径,因为”=“是赋值的意思,这样操作就用会新的路径覆盖掉原来的默认的PATH的路径,这样会导致你的程序可以运行,但是原来在默认路径下的其他命令却执行不了。
  • PATH=$PATH:新路径 这里 $PATH可以直接表示PATH原来的內容 ”“是分隔符。
  • 给PATH环境添加新路径,其实就是把新路径下的程序、软件安装到了操作系统中,让操作系统可以找到它。

四、环境变量与本地变量

在操作系统中变量也会分为本地变量和环境变量

1、本地变量创建

  • 直接在命令行上定义的变量,类似C语言的定义变量
  • 既然称为本地变量,当然不能在环境变量中找到
  • 使用echo可以查看本地变量
  • 使用set也可以查看本地变量

2、环境变量创建 

export 环境变量名=环境变量值意思是导出一个环境变量为lrkVar1,环境变量值为201903

unset 环境变量:可以将创建的环境变量删除

3、其他环境变量 

下面介绍一下其他的环境变量

五、C、C++中main()函数中的参数

 我们平时在使用C或者C++编程的时候,主函数main()都不带参数,但是这并不意味着它没有参数,相反它有着参数,且是三个参数,接下来就来介绍一下

int main(int argc,char *argv[],char* env[])
{\\....return 0;
}

1、agrc和argv

  • 我们先看第二个参数argv,他是一个数组,存储的是一个个字符指针,每个字符指针指向相对应的字符串,那它究竟要存多少字符指针呢?这就跟第一个参数相关了。
  • argc是一个整型,存储的是第二个参数的数组中的元素个数。

那么第二个参数中数组的內容是什么呢?既然是数组,我们不妨遍历即可。

当我们运行可执行程序后,如下 

  • 当我们不带任何选项运行./mymian后,可以看到数组的第0个元素事实上就是可执行程序本身。
  • 当我们带上多个选型进行运行后,可以看到这些选项也是该数组中的元素了。 
  • 也就是说, 我们给main()函数添加的 argc 和 argv参数, 其中 argc表示argv数组中元素的个数, 而argv数组中的元素 是由命令行参数提供的, 传入的元素是程序名以及选项。
  • 这样做的好处:程序可以获取到我们们用户输入的选项,从而实现一些的选项所对应的功能。类似我们在shell命令行中输入的带选项的命令,如 ls -al 、rm -f一样。

1)简易计算器的实现

学习了上面main函数中的argc和argv,我们就可以自己实现类似的命令行选项功能。

下面实现一个简易的计算器

-a -s -p -d分别代表的是加减乘除,用户输入的参数必须是四个,分别是可执行的程序、运算符号、数字1和数字2。因为argv中的数字是以字符串形式保存的,所以在拿出来时必须进行转换(atoi),接着进行判断和比较就可以了。 

下面是测试

可以看到,这个小程序可以像shell一样进行命令行类型的输出了。 

2、主函数main的第三个参数

我们可以看到main()函数的第三个参数也是一个数组,存储的就是字符串指针,那每个指针指向的內容又是什么呢?看它的名字是env,那就是和环境变量有关?我们用循环将它打印出来看看

argc,表示传递给程序的命令行参数的数量,包括程序的名称本身,因此其值至少为1,即使它没有指定额外参数。 

六、获取环境变量的方法

1、通过main函数的第三个参数

如上面演示的,通过main函数的第三个参数,我们可以直接在程序中遍历env数组的内容,然后将其内容依次打印显示在显示屏上,查看到系统中所有的环境变量之后,可通过echo $环境变量进行查看获取。

2、通过environ变量获取

3、通过调用接口getenv( )

将变量名字符串填入getenv的参数就可以获取到对应环境变量的内容

4、获取环境变量的作用 

作用之一就是可以限制程序功能的使用对象

七、环境变量具有全局性 

我们在进程那一节说过,当我们每次启动操作系统时,系统都会创建一个bash进程,其可以派生出很多的子进程,如果我们需要在命令行中运行自己的程序时,这个bash进程总是会自己创建一个子进程,让子进程代替他自己去执行该程序。这就是为什么我们每次启动系统后(中途不关机),无论怎么运行、运行多少次自己的程序,该进程的父进程的PID,也就是该进程的PPID永远不变的原因,因为它的父进程一直都是bash进程。

这些子进程都可以读取环境变量,所以环境变量可以被子进程继承下去,也就是说 子进程的环境变量来源于父进程,就我们从命令行运行的进程来说,这些环境变量的来源都是shell,而shell进程的环境变量也来源于它的父进程,这样一直向上推,可以推到1号进程。

环境变量是可以被子进程继承下去的,而普通变量是无法被子进程继承下去的 ,这就是env等命令无法查找本地变量的原因。

其实, Linux系统中的绝大部分命令都是以SHELL进程的子进程的形式运行的, 但是就是存在那一小部分命令并不通过子进程的方式执行, 而是SHELL自己执行.

SHELL也是会调用自己的相应的函数来完成部分功能的, 我们把这种不通过子进程的形式执行的命令, 称为自建命令。

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

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

相关文章

MacOS通过X11转发远程运行virt-manager进行虚机分配

今天需要通过本地macbook机器连接远程物理机,执行虚机分配,现有文档仅提供window环境安装,如下整理Mac环境下的安装步骤 操作篇 前提条件 支持x11转发的terminal,我本地使用iTerm2;本地安装XQuartz,作为…

【AI系统】AI 基本理论奠定

虽然 AI 在今年取得了举世瞩目的进展与突破,但是其当前基于的核心理论神经网络等,在这波浪潮开始前已经基本奠定,并经历了多次的起起伏伏。神经网络作为 AI 的前身,经历了以下的发展阶段: 萌芽兴奋期(约 19…

网络安全服务人才发展路线图

到2023年,全球网络安全支出规模将达到1512亿美元(约合10640.4亿元人民币),并将以9.4%的年复合增长率持续增长。与火爆的产业现状相比,中国的网络安全服务人才面临巨大缺口。相关数据显示,我国网络安全人才缺…

STM32 ADC 读取模拟量

问题 我有一个调速开关,模拟量输入,因此需要使用 STM32 读取模拟量,并通过串口输入来调试。串口相关知识参考 STM32 串口输出调试信息。 硬件信息: CubeMX version 6.12.1Keil uVision V5.41.0.0 参考知识 【STM32】HAL库 STM32CubeMX教…

[每周一更]-(第124期):模拟面试|缓存面试思路解析

文章目录 31 为什么 Redis 不立刻删除已经过期的数据?1. Redis 是怎么删除过期 key 的?2. Redis 为什么不立刻删除已经过期的 key?3. Redis 为什么不每个 key 都启动一个定时器,监控过期时间?4. Redis 是如何执行定期删除的?5. 为什么 Redis 在定期删除的时候不一次性把所…

操作系统——揭开盖子

计算机执行时——取指执行 es:bx等于从0x9000开始,到0x90200结束

uni-app 认识条件编译,了解多端部署

一. 前言 在使用 uni-app 进行跨平台开发的过程中,经常会遇到需要针对不同平台或不同环境进行条件编译的情况。条件编译是一种在编译过程中根据指定条件选择不同代码路径的技术,可以帮助我们在不同平台或环境下编写不同的代码,以适应不同的平…

模糊控制系统的设计(取材bilibili_蓝天的季洁)

模糊控制原理和传统控制原理,在框图上的区别实际上只在控制器方面存在差异,将传统的控制器改为了模糊控制器(fuzzy controller)。 通过举例说明,将原有的[0,100]的参数通过隶属函数规则,(类似于…

pytest日志总结

pytest日志分为两类: 一、终端(控制台)打印的日志 1、指定-s,脚本中print打印出的信息会显示在终端; 2、pytest打印的summary信息,这部分是pytest 的默认输出(例如测试结果PASSED, FAILED, S…

向量数据库FAISS之四:向量检索和 FAISS

来自 YouTube 1.相似度搜索的传统方法(Jaccard, w-shingling, Levenshtein) 1.Jaccard 距离 公式 Jaccard ( A , B ) 1 − ∣ A ∩ B ∣ ∣ A ∪ B ∣ \text{Jaccard}(A, B) 1 - \frac{|A \cap B|}{|A \cup B|} Jaccard(A,B)1−∣A∪B∣∣A∩B∣​ 其中, A 和 …

深入探究蓝牙节能技术:SNIFF与HOLD模式

目录 一、概述 1.1. Sniff Mode(嗅探模式/呼吸模式) 1.1.1.定义与目的 1.1.2 工作原理 1.1.3 进入与退出 1.2. Hold Mode(保持模式) 1.2.1. 定义与目的 1.2.2. 工作原理 1.2.3. 进入 1.2.4. 通知机制 二、Sniff mode&a…

Linux驱动开发快速入门——字符设备驱动(直接操作寄存器设备树版)

Linux驱动开发快速入门——字符设备驱动 前言 笔者使用开发板型号:正点原子的IMX6ULL-alpha开发板。ubuntu版本为:20.04。写此文也是以备忘为目的。 字符设备驱动 本小结将以直接操作寄存器的方式控制一个LED灯,可以通过read系统调用可以…

ROS机器视觉入门:从基础到人脸识别与目标检测

前言 从本文开始,我们将开始学习ROS机器视觉处理,刚开始先学习一部分外围的知识,为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本,系统采用Ubuntu20.04,ROS采用noetic。 颜…

电子电气架构 ---漫谈车载网关

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

@Autowired与构造器注入区别,为什么spring推荐使用构造注入而不是Autowired?

目录 1.简介 2.了解两种注入方式的全过程 2.1 Autowired字段注入 2.2 构造函数注入 3.使用autowired注解注入有以下问题 3.1空指针异常 3.2测试不友好 4.使用Lombok去简化构造函数注入的臃肿代码 5.小结 5.1注解注入 5.2构造函数注入 1.简介 使用Spring开发时&#…

优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本

Transformer 架构由 Vaswani 等人在 2017 年发表的里程碑式论文《Attention Is All You Need》中首次提出,如今已被广泛认为是过去十年间最具开创性的科学突破之一。注意力机制是 Transformer 的核心创新,它为人工智能模型提供了一种全新的方法&#xff…

在Excel中处理不规范的日期格式数据并判断格式是否正确

有一个Excel表,录入的日期格式很混乱,有些看着差不多,但实际多一个空格少一个字符很难发现,希望的理想格式是 1980-01-01,10位,即:“YYYY-mm-dd”,实际上数据表中这样的格式都有 19…

医工交叉入门书籍分享:Transformer模型在机器学习领域的应用|个人观点·24-11-22

小罗碎碎念 今天给大家推荐一本入门书籍。 这本书由Uday Kamath、Kenneth L. Graham和Wael Emara撰写,深入探讨了Transformer模型在机器学习领域的应用,特别是自然语言处理(NLP)。 原文pdf已经上传至知识星球的【入门书籍】专栏&…

SpringCloud Gateway转发请求到同一个服务的不同端口

SpringCloud Gateway默认不支持将请求路由到一个服务的多个端口 本文将结合Gateway的处理流程,提供一些解决思路 需求背景 公司有一个IM项目,对外暴露了两个端口8081和8082,8081是springboot启动使用的端口,对外提供一些http接口…

Parker派克防爆电机在实际应用中的安全性能如何保证?

Parker防爆电机确保在实际应用中的安全性能主要通过以下几个方面来保证: 1.防爆外壳设计:EX系列电机采用强大的防爆外壳,设计遵循严格的防爆标准,能够承受内部可能发生的爆炸而不破损,利用间隙切断原理,防…