Linux 第 17 章
命令行启动的进程都是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配置文件自定义添加的环境变量
上一篇: 告别动态编程,刷完40道算法题,我总结了一套动态调控的方法
下一篇: C++ 第 7 天作业