铁佛 发表于 2024-9-19 20:37:48

linux中的环境变量的深度理解。

基本概念
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。如:我们在编写c/c++代码的时候,在链接的时候,从来不知道我们的所连接的动态静态库在哪里,但是照样可以连接乐成,生产可执行程序,缘故原由就是有相关环境变量帮助我们编译器进行查找。环境变量具有一些特殊用途,另有在系统当中通常具有全局特性。
   思考:为什么linux 我们在运行Linux内核指令时不需要带路径,而运行我们自己编写的程序需要带路径呢?(如:./+(文件名))
https://i-blog.csdnimg.cn/direct/e7a679dfd2cf480cae417978c95c4b50.png
   和环境变量相关的指令
   echo体现某个坏境变量值export设置一个新的坏境变量env体现所有环境变量   常见环境变量
PATH指定下令的搜索路径HOME指定用户的主工作目录SHELL当前shell,他的值通常是/bin/bash   查看环境变量的方法
echo $NAME
我们输入echo $PATH  查看文件路径。
https://i-blog.csdnimg.cn/direct/7dfd2a47866145148c6e4253b75436fd.png
是由于我们在系统指令在usr/bin这个路径下,被我们系统找到,以是我们可以执行。
我们如何将自己写的程序加载到环境变量里面呢?
输入export=$PATH:/home/wjc/7.22导入系统中, 然后 test 就可以直接执行了。
   测试环境变量(我们可以通过指令的方式获取环境变量)
三种方法:
1.getenv
2.char*env[]
3.extern char **environ
   
getenvhttps://i-blog.csdnimg.cn/direct/3ba09e8463284dffb27627a9abfbe820.png
我们的环境变量都存放在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 }
    运行结果:
https://i-blog.csdnimg.cn/direct/8ba72861400940d09db900e0a5bbf65d.png
我们调用了环境变量。我们也可以自己定制环境变量
myval=1234567  定义环境变量 echo $myval 体现环境变量,如下图:
https://i-blog.csdnimg.cn/direct/dcbe7ebb228344ddb720503bd4081fd6.png
但是我们env里面是没有的,但是这种变量只能称之为本地变量(雷同c中的局部变量)。如果我们想把他导成环境变量(全局变量),export myval 就可以了 我们在查一下 env | grep myval 就可以查到了
https://i-blog.csdnimg.cn/direct/70c6a76d70a2444fb96744d429349ea8.png
以是我们可以得到结论:bash是一个系统进程,mycmd也会变成一个进程(fork),是bash的子进程,环境变量具有全局属性,是会被子进程进程下去(为什么要,bash可以帮我们找指令路径,身份认证 )。
unset清楚环境变量set体现本地定义的shell和环境变量 当我们不想要这个环境变量时,我们可以unset myval(变量名) 就删除了,然后我们查一下
set | grep myval 就不见了。
https://i-blog.csdnimg.cn/direct/41d7a67b46954c74a27a448ab70e39fe.png
   思考:为什么我们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++)
   {
         printf("env[%d]:%s\n",i,env);
}
return 0;
}
      
运行结果:https://i-blog.csdnimg.cn/direct/4e3f88f31c984e7381ed4472bc5c2443.png
可以发现就是我们的环境变量。
   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++)
   {
          printf("%d:%s\n",i,environ);
}
return 0;
}
结果:https://i-blog.csdnimg.cn/direct/a95d9cc19b6748759536274fed486516.png
   总结
我们上述调用环境变量的三种方式,我们发起使用getenv()这种方式,他可以直接根据名字拿到内容,比较方便。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: linux中的环境变量的深度理解。