【Linux进程】环境变量
目录
一、前言
本文着重介绍环境变量这一概念,从常见的main函数的参数列表出发,介绍了Linux中执行命令的本质--就是运行程序+命令行参数,随后认识了bash中所有的环境变量和获取、修改环境变量的方法,认识环境变量表,和自定义环境变量的区别,认识指令分类为内建命令和常规命令。
二、命令行参数
main函数其实是有参数的,它们分别是argc和argv,这两个参数又被称为命令行参数
int main(int argc , char* argv[])
argv是一个数组,指向的元素类型是char*,而agrc就是这个数组的元素个数
那么这个数组中存在着什么呢?我们不妨设计一个程序来验证一下:


此时我们就能得到结论,OS会把命令行输入的字符串放入main函数的参数列表中。
有没有觉得有点熟悉?如果把上图的1,2,3等字符串换为-l,-a等,是不是很像我们在Linux中使用的各种指令?例如ls -l ,ls就是可执行程序名,-l就是参数,调用指令其实就是运行一个程序。
三、环境变量
通过上述对main函数参数的了解,我们知道了指令的运行方式,但是这里有一个不同,为什么我们自己写的程序需要先写个 ./ ,而指令却不用呢?这里就得引出一个概念:环境变量PATH
在运行程序时,系统首先会去PATH中找当前可执行程序在不在这些路径中,如果在就直接执行程序,不在就报错,而我们自己写的程序不在这些路径下,就需要加个./让OS在当前目录下寻找我们写的程序。
使用 echo $PATH 来查看环境变量:

这些路径以冒号:分隔
1.修改环境变量
要想我们的程序像系统指令一样运行,我们可以将自己写的程序的路径加入到环境变量PATH中,使用指令:PATH = $PATH:要添加的路径

注意:当你将你的路径添加到PATH后,下次重启又会恢复默认路径,如果你想一劳永逸的话,可以将你写的程序直接放在默认PATH下
2.在bash中查看所有环境变量
使用指令:env 就能进行查看所有环境变量

会有很多密密麻麻的环境变量,但这里我们只需要认识几个:PWD,HOME,PATH
PWD:记录当前路径,平时执行的pwd指令就是通过获取PWD环境变量知道的
HOME:cd ~回到家目录,这个所谓的家目录就是HOME变量
3.获取环境变量的方法
使用函数:getenv() 即可获得对应环境变量的内容
如下代码:就可以获得环境变量PATH的内容
char* p = NULL;
p = getenv("PATH");
4.main函数的第三个参数env
其实main函数还有第三个参数,字符串数组env,没错它就是环境变量表。现在我们知道了系统在程序启动时会给main函数提供两张表:命令行参数表和环境变量表。
使用如下的代码可以查看环境变量表:

5.自定义环境变量
我们可以在bash中直接定义环境变量,使用指令:环境变量名=内容

然而用户自定义的环境变量是本地的,env表中并不会出现刚才在bash中自定义的环境变量,如果我们想把其放在系统的环境变量中,就需要使用指令:export 环境变量名
然而上述的修改、定义环境变量都是在修改bash进程内部的环境变量信息,每一次重新登陆都会形成新的bash解释器,而bash会自动从家目录下的bash_profile文件中读取信息形成一份新的环境变量表。之所以每次重启后我们自定义的环境变量就不见了,是因为它没有被配置到配置文件bash_profile中。

并且在创建子进程时,这张表会通过main函数的参数传递给子进程,因此子进程也有和父进程一样的环境变量表,因此环境变量具有全局性。
6.内建命令和常规命令
通过之前的学习,我们知道之所以能够直接使用系统指令,是因为环境变量,如果我们将PATH置空,这些命令是不是就不能运行了呢?

可以看见PATH被置空后,像ll这种指令确实失效了,但pwd却还能继续运行,这是为什么呢?
命令也分为两类:
- 常规命令:bash创建子进程执行的
- 内建命令:bash自己执行的
很明显pwd是内建命令,而ll是常规命令。其实像echo也是内建命令,之前我们自己定义的本地环境变量使用echo都能打印出来,而env环境变量表却没有,其实是因为echo是bash进程自己的程序,自然能发现自己内部的变化,而其他进程只是父进程的子进程,无法得知父进程的本地变量。
更多推荐
所有评论(0)