一.环境变量的概念

环境变量操作系统中用来指定操作系统运行环境的一些参数。
如:在C/C++代码链接的过程中,我们明明没有给编译器库的地址但它还是能找到,这是因为有环境变量辅助编译器查找。

二.命令行参数

main函数有参数吗?答案是可以有的!
在这里插入图片描述
像这个代码就是我们在命令行给main函数传递的参数,其中变量argv用来储存参数值,argc记录了所传参数的个数。那这是怎么做到的呢?
在这里插入图片描述
也就是说,当我们输入命令后,由bash来对该命令进行分割并创建命令行参数表,当bash创建子进程执行代码时它可以将命令行参数表传过去,这样main就得到了参数。

三.认识一些环境变量

环境变量到底有什么用呢?

认识PATH

学完指令后我们知道,所有的指令本质上都是可执行文件,使用指令就是调用这些文件,但我们可以发现,调用ls、cd… 这些指令时,我们根本没有给bash这些文件的绝对路径,那它是怎么调用的?
这是因为系统里有环境变量PATH的存在,它保存了一些路径,其中就有找到这些指令的路径。我们可以用echo $环境变量的形式查看环境变量的具体内容:
在这里插入图片描述
那这是不是意味着我们只要把某些路径加入进PATH中就可以让自己写的一些程序调用时不需要给路径?没错。
在这里插入图片描述
如果这样改的话我们会发现一些指令我们不能直接用了,所以我们要做的应该是在原本的值上加上目标路径:
在这里插入图片描述

认识其他

我们可以用指令env来查看系统内的所有环境变量:
在这里插入图片描述
HOSTNANE:保存了该系统的主机名;
SHELL:默认登陆shell(命令行解释器)的路径;
HISTSIZE:保留历史命令的最大个数,我们可以用history查看我们在该系统下输入的历史命令,其最大个数就取决于HISTSIZE;
OLDPWD:上一个工作目录;
SSH_TTY:当前用户说对应的终端;
USER:表示当前有效用户名;
PATH:记录一些路径,是大部分指令可以不用路径的原因;
PWD:当前工作目录;
HOME:家目录路径;
LOGNAME:表示用户登录时使用的用户名(一般都和USER一样)。

四.获取环境变量

环境变量怎么来?怎么维护?

环境变量的值是由系统配置文件得来的,这些文件储存在硬件中,当我们以用户身份登录操作系统后,OS会给我们一个bash,它就会从系统配置文件中读取信息并给这些环境变量赋值,并用字符串数组维护起来:
在这里插入图片描述
无论是环境变量表还是命令行参数表都是靠char**指针维护的,都是以NULL结尾。

环境变量相关命令

echo $环境变量:查看指定环境变量信息;
env:查看所有环境变量;
export:创造新的环境变量或修改已有环境变量;
unset 环境变量:删除目标环境变量;

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

代码中获取环境变量

方法一:
main函数中其实可以有三个参数。
在这里插入图片描述
第三个变量也是字符串数组,可以接收父进程传来的环境变量。

方法二:
函数getevn() 可以获取指定环境变量的值:
在这里插入图片描述
我们可以用这种方法去完成某些特定工作,如:只让指定的人执行该代码。

方法三:
在unistd.h文件中有全局变量char ** environ,它保存着环境变量:
在这里插入图片描述

环境变量的特性

环境变量具有全局性!
当bash创建子进程执行程序时,它同时会把环境变量表的地址传给子进程,当这个子进程再创建子进程时,表的地址也会继续传递下去。但如果在这个体系中,有进程修改了环境变量的值,那么它就会进行写实拷贝(就像父子进程共用代码数据一样),只让该进程环境变量的值进行改变。

那这样对export来说是否有些奇怪?当我们使用export时就说明环境变量一定发生了改变,但它不应该时bash创建子进程执行的吗,要改变也是export对应的进程中的环境变量改变,为什么bash中的环境变量会变?
这是因为export是bash的内建命令(built-in command),它不是bash创建子进程执行,而是由bash自己执行。

五.补充

为什么main函数有不同的参数形式

虽然我们总说main函数是程序的入口,当但OS执行起来时这句话并不成立,因为OS中是有函数会调用main函数的,在Linux中这个函数叫 _start,在它调用main函数时OS会先扫描main有几个参数,再通过_start中的不同分支调用main函数。

本地变量

在Linux中有本地变量的概念,在命令行直接创建即可:
在这里插入图片描述
可以通过创建变量去完成某些工作。bash本身就是一种脚本编译器,它很依赖本地变量。
我们用指令set可以查看所有本地变量和环境变量。
在这里插入图片描述

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐