文章目录
- 什么是环境变量?
- 什么是本地变量?
- 如何获取环境变量?
- 在shell中
- 在程序中
- 如何添加/删除环境变量&&本地变量?
- 在shell中
- 在程序中
- 为什么环境变量能够被子进程继承?
什么是环境变量?
环境变量是进程中的一种变量,它具有各种特殊的意义,但作用一般是为用户和OS提供他们想要的信息。环境变量是能够被子进程继承下去的。
比如,环境变量PATH中保存了程序的搜索路径、环境变量HOME保存了指定用户的主工作目录、环境变量SHELL保存了当前的Shell。
什么是本地变量?
本地变量是shell进程中的一种变量,只在本shell中起作用,因此本地变量不能够被子进程继承下去。
如何获取环境变量?
在shell中
1.获取目标环境变量&&本地变量
echo $NAME #NAME是目标环境变量名称
2.获取进程所有环境变量
env #env是一个命令
=
左边是环境变量民称,右边是环境变量的内容
3.获取进程所有环境变量&&进程的所有本地变量
set #set是一个命令
用set获取的内容非常多,因为同时获取了所有的环境变量和本地变量。
在程序中
1.获取目标环境变量通过函数getenv
#include #include int main(){char *s1 = getenv("PATH");char *s2 = getenv("HOME");char *s3 = getenv("SHELL");printf("PATH=%s\n", s1);printf("HOME=%s\n", s2);printf("SHELL=%s\n", s3);return 0;}
2.获取进程所有环境变量通过命令行第三个参数
#include int main(int argc, char *argv[], char *env[]){for(size_t i = 0; env[i]; ++i){printf("%s\n", env[i]);}return 0;}
3.获取进程所有环境变量通过第三方变量environ
#include int main(){extern char **environ;for(size_t i = 0; environ[i]; ++i){printf("%s\n", environ[i]);}return 0;}
如何添加/删除环境变量&&本地变量?
在shell中
添加本地变量
直接按照上面显示的格式输入自己的变量即可
添加环境变量
其实就是将本地变量变为环境变量
export 目标本地变量
也可以一步到位,不需要先定义本地变量
export 变量名=变量内容
删除环境变量&&本地变量
unset 目标变量
在程序中
通过函数putenv
#include #include int main(){putenv("myvar=12345678");extern char **environ;for(size_t i = 0; environ[i]; ++i){printf("%s\n", environ[i]);}return 0;}
为什么环境变量能够被子进程继承?
这是因为进程中有一张环境变量表,而进程地址空间里有指向该表的指针,fork创建子进程的时候会以父进程为模版创建PCB,此时该环境变量表和指针也就会被拷贝下来,所以子进程能够继承环境变量。