基本概念
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。如:我们在编写c/c++代码的时候,在链接的时候,从来不知道我们的所连接的动态静态库在哪里,但是照样可以连接成功,生产可执行程序,原因就是有相关环境变量帮助我们编译器进行查找。环境变量具有一些特殊用途,还有在系统当中通常具有全局特性。
思考:为什么linux 我们在运行Linux内核指令时不需要带路径,而运行我们自己编写的程序需要带路径呢?(如:./+(文件名))
echo | 显示某个坏境变量值 |
export | 设置一个新的坏境变量 |
env | 显示所有环境变量 |
常见环境变量
查看环境变量的方法
echo $NAME
我们输入echo $PATH 查看文件路径。
是因为我们在系统指令在usr/bin这个路径下,被我们系统找到,所以我们可以执行。
我们如何将自己写的程序加载到环境变量里面呢?
输入export=$PATH:/home/wjc/7.22导入系统中, 然后 test 就可以直接执行了。
测试环境变量(我们可以通过指令的方式获取环境变量)
三种方法:
1.getenv
2.char*env[]
3.extern char **environ
getenv
我们的环境变量都存放在env中,我们使用getenv()函数来获取环境变量,name代表环境变量的名字。编写下面代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define USER "USER" 4 int main() 5 { 6 char *who=getenv(USER); 7 printf("user:%s\n",who); 8 return 0; 9 10 }
运行结果:
我们调用了环境变量。我们也可以自己定制环境变量
myval=1234567 定义环境变量 echo $myval 显示环境变量,如下图:
但是我们env里面是没有的,但是这种变量只能称之为本地变量(类似c中的局部变量)。如果我们想把他导成环境变量(全局变量),export myval 就可以了 我们在查一下 env | grep myval 就可以查到了
所以我们可以得到结论:bash是一个系统进程,mycmd也会变成一个进程(fork),是bash的子进程,环境变量具有全局属性,是会被子进程进程下去(为什么要,bash可以帮我们找指令路径,身份认证 )。
unset | 清楚环境变量 |
set | 显示本地定义的shell和环境变量 |
当我们不想要这个环境变量时,我们可以unset myval(变量名) 就删除了,然后我们查一下
set | grep myval 就不见了。
思考:为什么我们ls 加文件就可以查到文件的信息呢?你是怎么指定我的文件地址的呢?
是因为当我们ls运行时,相当于创建了一个子进程,我们的父进程就是bash,父进程bash里面的pwd显示当前地址的环境变量被子进程ls继承,我们就知道了当前文件的地址了。
接下来我们谈一谈命令行参数main(int argv char*argv[ ],char*env[ ])
我们可以编写下面代码验证env();
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc, char*argv[],char*env[]) { for(int i=0;env[i];i++) { printf("env[%d]:%s\n",i,env[i]); } return 0; }
运行结果:
可以发现就是我们的环境变量。
extern char **evniron
#include<stdio.h> #include<stdlib.h> #include<string.h> //int main(int argc, char*argv[],char*env[]) int main() { extern char **environ; for(int i=0;environ[i];i++) { printf("%d:%s\n",i,environ[i]); } return 0; }
结果:
总结
我们上述调用环境变量的三种方式,我们建议使用getenv()这种方式,他可以直接根据名字拿到内容,比较方便。