欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Linux 第 17 章

最编程 2024-05-01 18:51:03
...

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

我们直接更改的是bash进程内部的环境变量信息!

每一次重新登陆,都会给我们形成新的bash解释器并且新的bash解释器自动从 读取形成自己的环境变量信息!

bash父进程的环境变量信息又从哪里来?

环境变量信息是以脚本配置文件的形式存在的!

每一次登录的时候,你的bash进程都会读取.bash_profile(在家目录下)

-rw-r--r--   1 BCH  BCH    193 11月 25 2021 .bash_profile

配置文件中的内容,为我们bash进程形成一张环境量表信息

本地环境变量

除了存在系统变量,自己也可以添加自己的环境变量(本地变量)

[BCH@hcss-ecs-6176 ~]$ MYENV_109=hellolinux
[BCH@hcss-ecs-6176 ~]$ echo $MYENV_109
hellolinux
[BCH@hcss-ecs-6176 ~]$ env | grep MYENV_109//但是通过env查询当前的环境变量并没有MYENV_109
[BCH@hcss-ecs-6176 ~]$

通过命令行export把本地变量暂时添加到系统变量里

[BCH@hcss-ecs-6176 10_21]$ export MYENY_109
[BCH@hcss-ecs-6176 10_21]$ ./mytest | grep MYENV_109//通过main传参能够查到MYENV_109
pid:6294,env[19]:MYENV_109=hellolinux
[BCH@hcss-ecs-6176 10_21]$ env | grep MYENV_109//通过env能够查到MYENV_109
MYENV_109=hellolinux

在命令行export的时候也可以创建本地变量暂时添加到系统变量里,因为是暂时写到系统变量,shell一旦退出,下次再在登录时,自己添加的环境变量就不存在了(根本原因是我们自己添加的环境变量在内存中)

如果想要将自己添加的环境变量保存在.bash_profile配置文件中

[BCH@hcss-ecs-6176 10_21]$ env | grep MYENV_10_21
MYENV_10_21=the_day_is_very_conflused,in10_21

第三种方法访问环境变量

extern char **environ;//全局二级指针变量

[BCH@hcss-ecs-6176 10_21]$ cat test.c
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
//int main(int argc,char* argv[],char* env[])
int main()
{
        //int i=0;
        //for(;env[i];i++)
        //{
                //printf("pid:%d,env[%d]:%s\n",getpid(),i,env[i]);
        //}
        //return 0;
        //
        
        extern char** environ;
        int i=0;
        for(;environ[i];i++)
        {
                printf("%d: %s\n",i,environ[i]);
        }
}

现在访问环境变量的方法有

getenv("环境变量”)/main传参/extern char** environ

本地变量vs环境变量

1)本地变量只在bash进程内部有效,不会被子进程继承

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

或则bash_profile配置文件自定义添加的环境变量