Linux中的环境变量

一、基本概念

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。

  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

二、获取和修改环境变量

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

image-20240715161045701

可以看到环境变量是非常多的,理解几个重要的。

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怎么就知道我们在哪个目录下?

image-20240715162749731

image-20240715162850669

登录的时候:

  • 输入用户名和密码
  • 认证
  • 形成环境变量(肯定不止一个,PATH,PWD,HOME)
  • 根据用户初始化HOME=/root或者HOME=/home/xxx
  • cd $HOME

就这样不同用户登录的时候,它的家目录都是确定好的。

三、PATH环境变量

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

image-20240715201242166

以冒号分割。

PATH环境变量是一个非常重要的环境变量。

它用于指定操作系统在执行命令时搜索可执行文件的目录路径列表。

比如ls命令,它不在当前的工作目录下,但是我们可以直接使用呢?原因就是ls是环境变量/usr/bin下的一个可执行文件。

image-20240715201907887


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

image-20240715202459006

image-20240715202534296

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


运行可执行程序,需要加上./,表明在当前路径下,我们可以将该可执行程序路径加入到PATH中去,就可以实现直接使用可执行程序。

添加路径到PATH中去,命令:PATH:$PATH:路径

image-20240715204601566

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

image-20240715205142156

可以发现,PATH置为空之后,很多命令是无法运行的,但是pwd却可以运行,这与后面说的内建命令有关!

四、环境变量的三种获取方式

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

①命令行第三个参数

main函数的前两个参数叫做命令行参数,那main函数还有第三个参数吗?其实是有的,叫做环境变量参数。

int main(int argc,char*argv[],char*env[])
#include<stdio.h>    
int main(int argc,char*argv[],char*env[])    
{    
      int i=0;    
      for(;env[i];i++)    
      {    
          printf("%s\n",env[i]);    
      }                            
      return 0;    
}    

image-20240715210126661

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

②通过第三方变量environ获取
#include<stdio.h>      
int main()      
{      
    extern char**environ;      
    int i=0;      
    for(;environ[i];i++)      
    {      
        printf("%s\n",environ[i]);      
    }                                                                           
    return 0;      
}

image-20240715210651706

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

③getenv访问特定的环境变量

image-20240715210738744

#include<stdio.h>
#include<stdlib.h>
int main()
{
    printf("%s\n",getenv("PATH"));
    printf("%s\n",getenv("SHELL"));
    return 0;
}

image-20240715211141658

五、配置文件

系统启动我们的程序的时候,可以选择给我们的进程(main)提供两张表:命令行参数表和环境变量表

命令行启动的进程都是shell/bash的子进程,子进程的命令行参数和环境变量是父进程传给我们的!

比如我们可以使用fork创建子进程:

#include<stdio.h>
#include<unistd.h>
int main()
{
    pid_t id=fork();
    if(id==0)
    {
        extern char**environ;
        int i=0;
        for(;environ[i];i++)
        {
            printf("%d:%s\n",i,environ[i]);
        }
    }
    return 0;
}

image-20240715234842126

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


那shell/bash的进程的命令行参数和环境变量又从哪里来呢?

在用户的家目录~下有一个文件隐藏文件:.bash_profile

环境变量的信息就是以脚本配置文件的形式存在在.bash_profile中的。

image-20240715231449878

image-20240715231544502

总结:每一次登录的时候,bash进程都会读取该文件中的内容,形成自己的环境变量信息!

六、本地变量vs环境变量

我们是可以自己定义环境变量的,和环境变量的格式一样,左边大写,中间等于,右边为变量值。

比如:MYENV_109=hellolinux!

image-20240716160612015

虽然echo可以显示出内容,但是显然我们的程序是读取不到该环境变量,环境变量表中并没有添加上该环境变量。

这样的环境变量叫做本地变量。

要将本地变量导入到环境变量表中去,使用命令export+本地变量。

image-20240716161000433

这样虽然导入到了环境变量表中,但是这是在内存中的,它是临时性的,当我们重新登录后,该环境变量又不在了。

刚刚我们说了,环境变量表信息是从文件.bash_profile中来的,需要永久保存我们自己定义的环境变量,就需要修改该文件的内容。

image-20240716162238140

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

image-20240716162301286


总结

本地变量:只在bash进程内部有效,不会被子进程继承下去。

环境变量:通过让所有的子进程继承的方式,实现自身的全局性!

这里就有个问题了,本地变量使用echo可以显示出来,但是我们自己写的程序,也就是bash的子进程,就没法看到本地变量。

echo同样是bash创建的子进程啊,说了本地变量只能在bash进程内部有效哇,和子进程无关哒,好奇怪哦。

其实这里就是我们下面要说的!!!

七、常规命令和内建命令

linux命令分类:

①常规命令,shell fork创建出的子进程。

②内建命令,shell命令行的一个函数,当然可以直接读取shell内部定义的本地变量咯。

显然echo就是一个内建命令!!!

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值