环境变量与本地变量

环境变量

一般指的是在操作系统上运行环境的一些参数。我们在编写C/C++代码时,在链接的时候,用户并不知道所链接的动静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关的环境变量去帮助编译器去查找。环境变量通常具有某些特殊用途,在系统当中具有全局属性。

PATH

指定命令的搜索路径,所谓的指令其实就是一个可执行程序,而这个可执行程序统一被放置在一个路径/usr/bin下面,也就是说,当我们把某一路径添加到PATH后,系统会自动从这些路径中去找寻对应的可执行文件并运行

可以看见当我们修改了PATH,去掉了/usr/bin之后,指令ls无法运行了,只有当指定了绝对路径之后才能继续运行

注意:普通用户修改环境变量时只有本次登录生效,重新登录后,PATH会恢复,这是因为PATH这个环境变量,它是有备份在系统的,当系统启动的时候,会给PATH重新赋值(也就是重新加载一遍配置文件),而这个备份(配置文件)就在家目录的.bash_profile中

USER

显示当前账号

SHELL

显示默认的命令行解释器

HOME

显示的是指定用户的主工作目录(即用户登录到Linux系统的默认目录)

查看系统的全部环境变量:env,set

  • set:set命令显示当前shell的所有变量,包括环境变量、本地变量以及shell特有的变量。这些变量不仅局限于用户的环境变量,还包括与shell会话相关的其他信息,如shell的功能选项和状态信息。
  • env:env命令仅显示环境变量,也就是那些被导出供子进程使用的变量。这些变量通常包括系统路径、用户信息等,对于定义程序运行环境至关重要。

重新认识main函数

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

main函数原本是有三个参数:argc:表示的是传入程序的元素数量,argv:传入程序中的元素表,由bash制作,传给main函数,envp[]环境变量表,所谓全局性就是指main函数通过此参数获取到的环境变量表的信息,也就是env显示的环境变量(最后一个环境变量是当前的运行可执行文件的路径)

环境变量表

在每个进程启动的时候都会收到一个环境遍历表,用于记录与当前进程有关的环境变量信息,这个环境变量表采用的是字符指针数组的形式进行存储,然后使用全局变量char** envrion来记录环境变量表的首地址,使用NULL来表示环境表的末尾:

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

结论:main函数的形参列表中写成的char* envp[]形式本质上是一个二级指针,也就是environ,而环境变量具有全局属性,程序运行时,环境变量表会传递给程序使用

环境变量的全局性:环境变量的本质上就是内存级别的一张表,这张表在用户登录系统的时候,由系统给用户单独形成,每一个环境变量都有不同的作用,许多的环境变量存储着用户的个人信息,不同的用户的环境变量表各不相同。

获取特定环境变量:getenv()

#include <stdio.h>
#include <unistd.h>
#include<assert.h>
#include<stdlib.h>
 
int main()                                                                                                                                         
{
    char *PWD=NULL;
    PWD=getenv("PWD");
    assert(PWD!=NULL);
    printf("%s\n",PWD);
    return 0;
}

本地变量

当用户登录Linux系统时,操作系统会自动给用户创建一个shell,用来为该用户提供命令行解释。shell本身是一个进程,会在shell中维护一张环境变量表。而用户在执行命令时,都是命令行解释器shell帮用户执行,对应到Linux系统下,就是bash在执行。bash除了可以执行命令外,还可以命令行式的自定义变量:

在命令行中写下指令 my=100 后,shell读取到指令,就会在内存中申请一块空间,并把该变量以字符串 "my=100" 的形式存放进去,最后在shell内部另外生成一个指针指向该字符串。

myval 是在命令行中定义的,只是前面没有加上 export ,所以 myval 虽然存在,但是并没有被导入表状结构中,这种变量被称为本地变量。

环境变量相对也就是本地变量,针对当前用户的当前进程生效,是一种临时变量,退出本次登陆后就失效了。

结论:本地变量只在当前的bash进程,也就是shell会话内部生效,并不被子进程所继承,也就是说本地变量与环境变量相比,不具备全局属性,而要想本地变量具备全局属性,就得把它定义为环境变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值