文章目录

      • 什么是环境变量?
      • 什么是本地变量?
      • 如何获取环境变量?
        • 在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,此时该环境变量表和指针也就会被拷贝下来,所以子进程能够继承环境变量。