目录
一.基本概念
当我们在使用Linux系统时,使用的命令实质上都是一些可执行程序。但是你又没有发现一个问题。我们在执行这条命令时并不知道这个可执行程序在哪,并且执行这条命令时不许要带路径。但是,我们自己编写的代码生成的可执行程序运行时,需要带上路径。这就是环境变量在起作用。
- 环境变量一般指在操作系统中用来指定操作系统运行环境的一些参数。
- 环境变量通常具有某些特殊的用途,在系统中通常具有全局特性。
说白了,环境变量是在系统中具有一定全局性质的变量,通常是为了满足某些系统的需求。指明操作系统的某些重要目录在哪。
先来看一下我的linux下的环境变量:
我们发现,环境变量里存在的是一些变量,后面的内容是一些路径和值。
1.常见的环境变量
- PATH:指定命令的搜索路径
- HOME:指定用户的主工作目录(即登录到Linux系统中时,默认工作目录)
- SHEEL:当前sheel。它的值在centos中通常时/bin/bash
二.命令
1.查看环境变量的方法
- 命令"echo $NAME",NAME环境变量名。
2.其它相关指令
- export:设置一个新的环境变量
- env:显示所有环境变量
- unset:清除环境变量
- set:显示本地定义的shell变量和环境变量
3.测试PATH
- 创建一个源文件test.c
1 #include<stdio.h>
2
3 int main(){
4 printf("hello test1\n");
5
6 return 0;
7 }
- 环境变量时如何实现调用系统命令不需要加路径,而我们编写的可执行程序需要加路径?
我们编写的生成的程序一般和PATH环境变量有关,系统提供的那些路径保存在了PATH环境变量的某个路径下了。当执行一条命令时,系统会在PATH环境变量的路径下找,找到这个可执行程序,就执行这条命令,没找到就会报错。
环境变量不只PATH一个环境变量,说明它还有其它很多功能。
- 如何实现我们些的程序可以像命令一样不加路径执行?
1.将可执行程序的绝对路径加到PATH路径下。(linux特有,重新启动加的路径就没了)
2.将可执行程序加到PATH的某个路径的目录下。(不推荐,污染系统下的命令)
- 这些系统命令是如何到环境变量中的?
安装软件时,会把对应软件的可执行程序拷贝到PATH的某个路径下,PATH只是环境变量之一,系统还有很多环境变量又来解决不同场景。
三.环境变量的组织方式
- 环境变量实际是一个字符指针数组,每一个字符指针指向一个环境字符串。这个指针数组以NULL结尾。
四.通过代码获取环境变量
这里说明一下,其实我们的main函数有三个参数,其中第三个参数就是我们的环境变量。
ps补充:可执行程序后面加命令行参数
//显示命令行参数
1 #include<stdio.h>
2
3 int main(int argc,char *argv[],char *env[]){
4 for(int i=0;i<argc;i++){
5 printf("argv[%d]: %s\n",i,argv[i]);
6 }
7 return 0;
8 }
命令行参数实际也是一个字符指针数组,不以空结尾。指向一个个命令行参数的字符串。如上:
所以那些ls -a指令是可以通过判断来实现不同操作:
1 #include<stdio.h>
2 #include<string.h>
3
4 int main(int argc,char *argv[],char *env[]){
5 char *s=argv[1];//必须传一个命令行参数
6 if(strcmp(s,"-a")==0){
7 printf("hello -a\n");
8 }
9 else{
10 printf("hello other\n");
11 }
12 return 0;
13 }
注意:即使main函数没有参数传入,这三个参数仍然存在,值系统获取调用的。
- 通过main函数的第三个参数获得
1 #include<stdio.h>
2 #include<string.h>
3
4 int main(int argc,char *argv[],char *env[]){
5 for(int i=0;env[i];i++){
6 printf("%s\n",env[i]);
7 }
8 return 0;
9 }
和命令env显示的一样
- 通过第三方变量获取
libc(c库函数)中定义全局变量environ指向环境变量表,envron没有包含在任何头文件中,所以要extern证明。
1 #include<stdio.h>
2 #include<string.h>
3
4 int main(int argc,char *argv[],char *env[]){
5 extern char **environ;
6 for(int i=0;environ[i];i++){
7 printf("%s\n",environ[i]);
8 }
9 return 0;
10 }
仍然可以得到相同结果。
五.通过系统调用获取环境变量
- getenv(存在头文件stdlib.h中),访问特定环境变量,查找失败返回0
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 int main(){
5 printf("%s\n",getenv("PATH"));
6 return 0;
7 }
六.环境变量通常具有全局属性
- 环境变量通常具有全局属性,可以被子进程继承下去
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 int main(){
5 char *env=getenv("MYVAL");
6 if(env){
7 printf("%s\n",env);
8 }
9 return 0;
10 }
直接运行:
当我在bash进程加入MYVAL环境变量
原因:在bash加入的环境变量,它的子进程test1也可以访问,具有全局性是这样体现的。
七.windows系统中的环境变量