前言
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
举例:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
一、main参数
在C语言中,main函数其实也有三个参数,第一个参数叫做int argc,第二个叫做char* argv[],前者代表后者的字符串个数,第三个是环境变量,使用以下代码打印参数具体内容
#include <stdio.h>int main(int argc,char*argv[],char *env[])
{int i =0;for(;i<argc;i++){printf("%s\n",argv[i]);}
return 0;
}
通过运行结果发现,它储存的内容是输入在bash里面的字符串
其实质是bash会获取用户输入在命令行中的内容,然后根据空格分隔转换为多个字符子串,通过一定的方法传给main函数,其目的是根据用户输入的不同选项让同一个程序执行对应的功能,例如:ls和ls -l运行的程序是相同的,都是ls,但是由于其选项不同,其运行结果却是不同的,命令行参数是指令的基础
二、环境变量
环境变量有很多,之间没有什么联系
环境变量是系统内置的具有特殊用途的变量,就是操作系统开辟的一块内存空间
查看环境变量
通过以下命令可以查询到配置的环境变量
$echo $PATH
由结果可知,环境变量由一条条字符串组成
程序路径问题
[root@hcss-ecs-e53a test2]# mybin
-bash: /usr/bin/mybin: No such file or directory
[root@hcss-ecs-e53a test2]# ./mybin
./mybin
在Linux下面运行自己的程序时,必须加上路径,否则无法运行,而运行系统的指令时,却不需要,这是因为系统在创建进程的时候,必须先找到该可执行程序,然后才将其加载到内存中进而创建PCB对象,系统会去/usr/bin目录下面找,系统自带的程序都在该目录下,而自己的程序不在该目录下面,所以会提示找不到该程序。
所以,想要不带路径直接搜索程序,则可将自己的程序添加到/usr/bin下面,如下
[root@hcss-ecs-e53a test2]# cp mybin /usr/bin
[root@hcss-ecs-e53a test2]# mybin
mybin
或者是将存放自己程序的目录添加到PATH环境变量里面去
[root@hcss-ecs-e53a test2]# PATH=/home/yw/class/test2:$PATH
[root@hcss-ecs-e53a test2]# $echo $PATH
-bash: /home/yw/class/test2:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/bin/vim:/root/bin:: No such file or directory
[root@hcss-ecs-e53a test2]# mybin
mybin
注意:
环境变量是操作系统/bash在开机时根据配置文件开辟的一块内存空间,在重新连接bash或者是重新开机后,以上方式配置的环境变量又会被初始化,其原因是bash的环境变量来自于磁盘里的脚本和配置文件,在bash进程开启后,会从磁盘中获取环境变量保存到内存中,在每个用户的家目录下面,都存在一个叫做bash_profile的配置文件,在bash进程开启时,会读取该文件
三、环境变量的操作与特性
操作
1)echo $环境变量名称
作用:展示环境变量的内容
2)env
作用:展示当前所有的环境变量
3)export 环境变量=值
作用:新建环境变量
[root@hcss-ecs-e53a test2]# export AGE=21
[root@hcss-ecs-e53a test2]# env
特性
全局性
在main函数里面main函数还有第三个参数env,使得在main函数中可以直接获取系统的环境变量
#include <stdio.h>
int main(int argc,char*argv[],char*env[])
{for(int i=0;env[i];i++){printf("------env[%d]->%s\n",i,env[i]);}
}
环境变量由父进程bash给main函数传递,换言之,bash里面已经存在了一张环境变量表,在创建子进程的时候,环境变量默认是可以被所有的子进程继承的,所以环境变量具有全局性。
四、环境变量的获取与设置
获取环境变量
1)通过main参数获取
#include <stdio.h>
int main(int argc,char*argv[],char*env[])
{for(int i=0;env[i];i++){printf("------env[%d]->%s\n",i,env[i]);}
}
2)通过函数接口获取
传入环境变量名字,就可以获取其值,该方法为最常用的方法
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>int main(){printf("PATH--->%s\n",getenv("PATH"));return 0;
}
3)通过第三方变量获取
#include <stdio.h>int main(){extern char**environ;int i=0;for(;environ[i];i++){printf("%s\n",environ[i]);}return 0;
}
在此例中,通过外部变量environ二级指针获取环境变量,然后逐步打印环境变量
删除环境变量
unset 环境名
五、环境变量与本地变量
根据上文可知,在bash中,可以通过export定义一个变量,该变量称为环境变量
[yw@hcss-ecs-e53a test3]$ export b=11
可以通过env获取到
可以直接定义一个变量,该变量称为本地变量
[yw@hcss-ecs-e53a test3]$ a=1
该变量无法通过env获取,需要通过set获取
使用set可以获取到所有环境变量和一些非环境变量
获取到的非环境变量就叫做本地变量
本地变量只能供给本进程使用(此处是bash),不会继承给子进程
通过以下代码可以验证
#include <stdio.h>
#include <stdlib.h>
int main(){char* ret= getenv("a");if(ret)printf("ret = %s\n",ret);else printf("ret is NULL\n");return 0;
}
在子进程中,无法获取bash进程的本地变量