Linux中的环境变量

打印 上一主题 下一主题

主题 659|帖子 659|积分 1977

一、基本概念



  • 环境变量(environment variables)一般是指在操作体系中用来指定操作体系运行环境的一些参数。
  • 如:我们在编写C/C++代码的时间,在链接的时间,从来不知道我们的所链接的动态静态库在那里,但是照样可以链接乐成,生成可执行步伐,原因就是有相关环境变量帮助编译器举行查找。
  • 环境变量通常具有某些特殊用途,还有在体系当中通常具有全局特性
二、获取和修改环境变量

命令:env。可以获取体系中全部的环境变量。

可以看到环境变量是非常多的,理解几个重要的。
USER=csj
解释:当前登录的用户名。
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/csj/.local/bin:/home/csj/bin
解释:可执行文件的目次路径列表。
HOME=/home/csj
解释:用户登录目次路径(也就是家目次)。
PWD=/home/csj
解释:当前工作目次。

当我们登录平凡用户的时间和登录root用户的时间,pwd怎么就知道我们在哪个目次下?


登录的时间:
   

  • 输入用户名和暗码
  • 认证
  • 形成环境变量(肯定不止一个,PATH,PWD,HOME)
  • 根据用户初始化HOME=/root或者HOME=/home/xxx
  • cd $HOME
  就如许差别用户登录的时间,它的家目次都是确定好的。
三、PATH环境变量

命令echo $PATH查看PATH环境变量。

以冒号分割。
PATH环境变量是一个非常重要的环境变量。
它用于指定操作体系在执行命令时搜索可执行文件的目次路径列表。
好比ls命令,它不在当前的工作目次下,但是我们可以直接利用呢?原因就是ls是环境变量/usr/bin下的一个可执行文件。


在windows体系中也是一样的,环境变量也是有大作用的,好比我们可以将QQ的路径添加到PATH环境变量中,利用cmd命令也可以打开QQ。


也是一样,在cmd运行框中,虽然qq的路径不在该路径下,但是一样可以运行,这就是PATH环境变量的作用,由此可见,PATH环境变量是具有全局性的。

运行可执行步伐,需要加上./,表明在当前路径下,我们可以将该可执行步伐路径加入到PATH中去,就可以实现直接利用可执行步伐。
添加路径到PATH中去,命令:PATHPATH:路径

还可以PATH=“”,将PATH直接置为空。注意这里全部修改PATH的做法都是临时性的,它是在内存中实现的,当你重启xshell后,环境变量又会重置(由于.bash_profile文件并没有修改)。

可以发现,PATH置为空之后,很多命令是无法运行的,但是pwd却可以运行,这与后面说的内建命令有关!
四、环境变量的三种获取方式

通过代码如何获取环境变量

①命令行第三个参数

main函数的前两个参数叫做命令行参数,那main函数还有第三个参数吗?其实是有的,叫做环境变量参数。
  1. int main(int argc,char*argv[],char*env[])
复制代码
  1. #include<stdio.h>    int main(int argc,char*argv[],char*env[])
  2.     {          int i=0;          for(;env[i];i++)          {              printf("%s\n",env[i]);          }                                  return 0;    }   
复制代码

通过main函数第三个参数,同样可以得到环境变量。
②通过第三方变量environ获取

  1. #include<stdio.h>      
  2. int main()      
  3. {      
  4.     extern char**environ;      
  5.     int i=0;      
  6.     for(;environ[i];i++)      
  7.     {      
  8.         printf("%s\n",environ[i]);      
  9.     }                                                                           
  10.     return 0;      
  11. }
复制代码

通过体系调用获取或设置环境变量

③getenv访问特定的环境变量


  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5.     printf("%s\n",getenv("PATH"));
  6.     printf("%s\n",getenv("SHELL"));
  7.     return 0;
  8. }
复制代码

五、配置文件

体系启动我们的步伐的时间,可以选择给我们的历程(main)提供两张表:命令行参数表和环境变量表
命令行启动的历程都是shell/bash的子历程,子历程的命令行参数和环境变量是父历程传给我们的!
好比我们可以利用fork创建子历程:
  1. #include<stdio.h>
  2. #include<unistd.h>
  3. int main()
  4. {
  5.     pid_t id=fork();
  6.     if(id==0)
  7.     {
  8.         extern char**environ;
  9.         int i=0;
  10.         for(;environ[i];i++)
  11.         {
  12.             printf("%d:%s\n",i,environ[i]);
  13.         }
  14.     }
  15.     return 0;
  16. }
复制代码

再次验证了环境变量具有全局性!!!

那shell/bash的历程的命令行参数和环境变量又从那里来呢?
在用户的家目次~下有一个文件隐藏文件:.bash_profile
环境变量的信息就是以脚本配置文件的形式存在在.bash_profile中的。


总结:每一次登录的时间,bash历程都会读取该文件中的内容,形成本身的环境变量信息!
六、当地变量vs环境变量

我们是可以本身定义环境变量的,和环境变量的格式一样,左边大写,中心等于,右边为变量值。
好比:MYENV_109=hellolinux!

虽然echo可以显示出内容,但是显然我们的步伐是读取不到该环境变量,环境变量表中并没有添加上该环境变量。
如许的环境变量叫做当地变量。
要将当地变量导入到环境变量表中去,利用命令export+当地变量。

如许虽然导入到了环境变量表中,但是这是在内存中的,它是临时性的,当我们重新登录后,该环境变量又不在了。
刚刚我们说了,环境变量表信息是从文件.bash_profile中来的,需要永世生存我们本身定义的环境变量,就需要修改该文件的内容。

在该文件中导入本身定义的环境变量,需要使得环境变量见效,需要重新登录一下,使得bash重新读取该文件。


总结
当地变量:只在bash历程内部有效,不会被子历程继承下去。
环境变量:通过让全部的子历程继承的方式,实现自身的全局性!
这里就有个问题了,当地变量利用echo可以显示出来,但是我们本身写的步伐,也就是bash的子历程,就没法看到当地变量。
echo同样是bash创建的子历程啊,说了当地变量只能在bash历程内部有效哇,和子历程无关哒,好奇怪哦。
其实这里就是我们下面要说的!!!
七、常规命令和内建命令

linux命令分类:
①常规命令,shell fork创建出的子历程。
②内建命令,shell命令行的一个函数,固然可以直接读取shell内部定义的当地变量咯。
显然echo就是一个内建命令!!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表