1.铺垫
1.1环境变量是系统提供的一组name=value形式的变量,不同的环境变量有不同的用户,通常具有全局属性
1.2多个可执行程序的运行,他们的环境变量的部分数据是不同的,比如说PWD等数据
1.3环境变量里的数据,多为K-V结构(name=value);也就是说找到key,就找到了value
1.4环境变量中存在用户名,用户日志,系统默认路径等信息,为权限的确认做了重要的保障
1.5我们所运行的进程,都是子进程;bash本身在启动的时候,会从操作系统的配置文件中读取环境变量信息;如果创建子进程,子进程会继承父进程的环境变量(系统交给父进程的环境变量)——所以环境变量具有全局属性;
1.6环境变量的传递:一是继承,由父进程传给子进程(所有进程都是操作系统的子进程,所以肯定都能传下去;每个运行的子进程肯定会走这条路;这是默认的);二是参数传递
1.Linux系统程序运行搜索路径
命令 echo $环境变量名称
echo $PATH //查看程序运行搜索路径PATH——会看到一堆的路径
echo:打印命令
$: 要输出的变量或文本,这里指变量;
PATH:Linux系统的指令搜索路径;以冒号作为分隔符,一串一串的绝对路径
2.添加路径到环境变量PATH
命令 PATH=$PATH:/home/qk/... //将自己的环境变量添加到系统中
PATH:是覆盖式写入,必须要把以前的环境变量加上,$PATH必须有
该环境变量会在重启时重新在shell中默认设置,也就是说新添加的环境变量会在重启后消失
3.查看环境变量
说是系统的环境变量——其实是用户信息及系统资源配置(环境变量及系统对应一系列提信息)
命令 env:查看从系统继承下来的所有的环境变量
此命令可以看到很多信息,比如用户自定义环境变量,系统环境变量,用户名,当前路径记录、编码格式、日志名称等信息;
命令 cd - 其实是执行的cd $OLDPWD
命令 history:查看历史的bash命令 HISTSIZE=1000最多纪录1000条bash指令
4.新增环境变量
命令: export myvalue=123456 //将myvalue=123456添加到环境变量中
5.删除环境变量
命令:unset myvalue //删除环境变量myvalue
6.本地变量&&内建命令
本地变量由来:需要一些只在bash内部有效的符号,但不需要子进程继承下去,所以有了本地变量的概念
命令 a=20 //a=20会显示在环境变量中,但不会被子进程继承;叫本地变量
命令:set //显示本地变量(本地定义的shell变量)和环境变量
本地变量只会在本BASH内有效,不会被子进程继承;
命令分为两种
1.常规命令:通过创建子进程完成
2.内建命令:bash不创建子进程,而是由自己亲自执行,类似于bash调用了自己写的,或者系统提供的函数
内建命令:cd、echo
7.putenv()函数
#include<stdlib.h>
int putenv(char *sting) //程序中获取环境变量
string:一个字符串;书写为 name=value
举例
char *string="myvalue=123456";
若环境变量中存在name,则修改value的值;若不存在name,则添加name=value
由此,此函数为覆盖式写入
8.getenv()函数
#include<stdlib.h>
char *getenv(const char *name) //程序中获取环境变量
参数:是基于K-V模型的;const char *name中的name="环境变量中的key"
环境变量是一个基于K-V(name=value)的;
所以参数char *name="key";通过getenv()函数来寻找name值,返回value值
9.chdir()函数
#include<unistd.h>
int chdir(const char *path) //将正在运行的进程的工作目录改变成path中的路径;
10.命令行参数
命令行参数:
int main(int argc,char *argv[],char *env[]) //主函数带参
char *argv[]命令行参数表——数组的最后一个指针指向为NULL;
char *env[] 环境变量列表——数组的最后一个指针指向为NULL;
如果在main(int argc,char *argv[])函数不写char *env[]参数,那就是空,不会从上级程序的环境变量中拷下来;只能用getenv()函数获取
这两个数组可以使用for循环在程序中打印出来
mian()函数中(进程中)存在两张核心向量表
1.命令行参数表
2.环境变量表
11.第三方变量environ获取
C语言提供了第三方变量,可以在程序中获取;如下方使用
#include
int main(int argc, char *argv[])
{
extern char **environ;
i = 0;
for(; environ[i]; i++){
printf("%s\n", environ[i]);
}
return 0;
}