目录
环境变量一般指在操作系统中来指定操作系统运行环境的一些参数
如:C/C++程序在链接动静态库的时候,这些库的路径在哪里,我们是不需要担心的
如:在Linux下输入指令,本质就是在运行进程,而我们在运行自己的进程时是需要带路径的,指令则直接输入即可,这都是因为在系统中有环境变量导致的,系统根据环境变量自动的就去找到了路径
以下的一些操作用环境变量PATH举例
环境变量具有全局性
全局性的本质:
子进程的环境变量都是从父进程来的
所有的环境变量都会被子进程继承
main函数的父进程是bash,而bash中的是从操作系统中来的
更形象的可以理解为,以bash为一颗多叉树向下由子进程继承,则所有进程都会有
普通变量和环境变量的差别:
本质就是环境变量具有全局性,而普通变量没有
普通变量 = 局部变量
环境变量 = 全局变量
定义普通变量:普通变量名=内容
定义环境变量:export 环境变量名=内容
PATH:指定命令的搜索路径
HOME:指定用户的主工作目录
SHELL:当前shell它的值通常是/bin/bash
echo $环境变量名称
例如:echo $PATH
PATH环境变量用冒号做分隔,每一个冒号后都是一个新的路径
![]()
env:查看所有环境变量
set:查看所有变量
这里设置环境变量既有设置也有修改
环境变量的设置与修改都仅限于本次登录
因为环境变量具有全局性,每一个子进程都会继承父进程的环境变量,所以如果只是修改当前的环境变量目录的话,也就是只修改了bash,每一次登录就都意味着操作系统要新创建一个bash,bash的环境变量也是由操作系统继承下来的,所以如果想要永久修改环境变量的话,就要修改系统的配置文件。(但是强烈不建议这么做,以防污染原来的系统)
设置新的环境标量一定要有export,修改的话可有可无
export 环境变量=要配置的环境变量
例如:export PATH=$PATH:新增路径

以环境变量表的形式组织起来,最终每个进程都会收到一张环境表
环境变量表的本质就是一个字符指针数组,这是一个数组,数组的每个元素存放的是字符串首地址,最终这个字符串以\0结尾,并且这个字符指针数组结尾是NULL
通过main函数中的三个参数之一:char*env[]就可以打印出环境表
- int main(int argc, char* argv[], char*env[])
- {
- printf("---------------------------\n");
- //查看当前所有的环境变量
- int i = 0;
- for(; env[i]; i++)
- {
- printf("%s\n",env[i]);
- }
- printf("---------------------------\n");
- return 0;
- }
或者通过系统的environ二维指针来打印出环境表
- #include
-
- int main()
- {
- extern char** environ;
- int i = 0;
- for(; environ[i]; i++)
- {
- printf("%s\n",environ[i]);
- }
- return 0;
- }

查看某一个环境变量:getenv函数

- #include
- #include
-
-
- int main()
- {
- printf("%s\n",getenv("PATH"));
- return 0;
- }
![]()
char argc与char* argv[]是命令行参数
- #include
-
- int main(int argc, char* argv[])
- {
- int i = 0;
- for(; i < argc; i++)
- {
- printf("argc:[%d] argv:[%s]\n",i ,argv[i]);
- }
- return 0;
- }
本质:
2.具体怎么用- #include
- #include
-
- int main(int argc, char* argv[])
- {
- if(argc != 2)
- {
- printf("必须带有选项\n");
- return 0;
- }
- if(strcmp(argv[1],"-a")==0)
- {
- printf("这是功能一\n");
- }
- else if(strcmp(argv[1],"-b")==0)
- {
- printf("这是功能二\n");
- }
- return 0;
- }

这本质就是我们在Linux命令行下输入的命令,每个命令带不同的选项执行不同的功能