前言
在上一篇文章中简单的介绍了环境变量,但是没有讲述的比较全面了,所以现在再写一篇来介绍环境变量。
环境变量
在上一篇文章中,我们已经简单的学习了如何进行对于环境变量的修改并且能够知道环境变量在家目录的文件中修改才能够保证每一次的登录都是保存了我们自己添加的路径的。
1、更多的环境变量及添加和删除
代码语言:javascript复制env:查看所有的环境变量
echo $HOME:家目录的环境变量
echo $PWD:当前目录的环境变量
echo $SHELL:命令行解释器
echo $HISTSIZE:表示的是操作系统会记住用户最新的多少条指令
那我们能不能直接自己定义一个环境变量呢?
代码语言:javascript复制export THIS_IS_MY_PATH=(自己的地址)
此时的添加也是内存级别的,所以说重新登陆的话,就不能看到我们这次的操作了。 那导入有了,怎么删除?
代码语言:javascript复制unset THIS_IS_MYPATH:删除环境变量
如果不用export的话,直接设置的话,这就不算是环境变量,只能说是一个本地的变量。
当然这个如果是不是环境变量的话,怎么能够让本地的变量变为是环境变量呢?
代码语言:javascript复制//如果已经像上面的定义过本地变量的话,可以直接
export hello
//如果没有定义过本地变量的话,就像上文一样的操作就行了
export hello=helloqzy
2、整体理解环境变量系统
这就展示了,我们能够通过C/C 的代码的方式获得环境变量。所以根据上一章写过的在运行程序之前会有bash的命令执行的话,说明环境变量默认也是可以被子进程拿到的。环境变量默认存在的就是在bash内部(不过我们还没说能够被子进程修改从父进程那得到的数据)。 那环境变量的话在bash中是怎么管理的? 把环境变量存在指针数组之中!所以我们刚刚的程序能够得到所有的环境变量。此时的这个指针数组的最后一个位置也必须要是NULL。 所以现在bash进程启动的时候,默认会生成两个表,argv[]命令行参数表,env[]环境变量表,bash通过各种方式交予进程。 命令行参数表是用户在执行可执行文件输入命令行得到的,环境变量表是从OS的配置文件中得到的。 相信上面其中的environ二级指针的含义应该也是能够理解的了,因为environ中的每一个元素都得是一个字符串,但是C语言中没有string的含义,所以每个字符串,只能够用char*的指针来表示,那数组值中存储的每一个元素都是指针,那指向这个数组的指针的话,那也必须要用到二级指针了啊。要么就直接是指针数组直接表示这个环境变量表。 那我们除了这种方式能够实现环境变量的传入,那我们还能够怎么实现呢?其实第二种实现的的方式就是通过main函数传参,原理其实也相似于命令行参数的原理。
环境变量本身具有系统级别的全局属性,因为环境变量本身能够被子进程继承下去。
代码语言:javascript复制getenv:单个获取环境变量的内容
//获取成功的话为非0,获取失败的话等于NULL
总结: 获得环境变量的三种方式。 1、extern char **environ 2、通过main函数参数 3、getenv(“path”)
可是我们上面使用的extern添加path的时候难道不也是bash下创建的一个子进程吗?那子进程的数据这么能够给到bash父进程呢? 因为export,echo的一些命令,这些命令叫做内建命令(80%的命令都是bash创建子进程进行的,但是剩下的一些就是由bash亲自进行的)。
3、内建命令
当我们在上一个,就是我们直接定义的话
会出现这种情况。HELLO是本地的变量。如果我们写程序在程序中进行寻找的话也是不能够找到的,只能够通过echo来寻找。将本地的变量export的话,在env中才能够找到我们定义的环境变量,这说明什么,这说明我们定义的这个变量在一开始的时候一定是存在的,只不过不是存在环境变量中配置的,但是如果是只是加上export的话能够不变程序的情况下能够找到的话,这说明什么?这说明这个bash中一定是在原本就存储着我们定义的变量,只不过在使用export之后,bash的这个能够被继承到子进程之中,原本不能够继承。 所以本地变量只能在本bash中有效,不能被子进程继承下去。只有成为环境变量才能够被获取。 !!所以所以!!我们上一篇文章中介绍的echo不是bash的子进程而是内建命令,就能够很好的说明,echo能够直接读到本地变量。因为是不能够继承给子进程,说明内建命令就不是子进程,而是bash直接进行的。