当我们在Linux操纵体系进行操纵时,我们会发现使用体系命令的时间,像 cd ls pwd等等,通常不须要带对应的路径,只须要写对应的名字就可以了,而我们本身写的程序在运行时却必须要带上路径。这就和我们今天要学的情况变量中的 PATH有关了。
1.什么是情况变量
情况变量(env
ironment variables)一样寻常是指在操纵体系中用来指定体系运行情况的一些参数,就好比:我们在编写C/C++代码时间,在链接的时间,从来不知道我们所链接的动静态库在哪里,但是照样可以链接乐成,生成可执行程序,原因就是干系情况变量资助编译器进行查找。情况变量通常具有某些特殊的用途,还有在体系当中通常具有全局属性。
2.常见情况变量
- PATH:指定命名的搜刮路径
- HOME:指定用户的主工作目录(及用户登录到Linux体系时,默认的目录)
- SHELL:当前Shell,它的通常值是/bin/bash.
3. 如何查看情况变量
查看所有情况变量语法:
演示:
查看特定的情况变量语法:
- echo $NAME //NAME为你环境变量的名称
复制代码 查看PATH:
4. 测试PATH
先写一段代码:
- #include <stdio.h>
- int main()
- {
- printf("test PATH\n");
- return 0;
- }
- //形成的可执行文件为mybin
复制代码 makefile:
- mybin:test.c
- gcc -o mybin test.c
- .PHONY:clean
- clean:
- rm -f mybin
复制代码 通过测试我们可以发现,当我们输入./mybin才可以运行这个代码,而直接输入mybin是无法运行的。
为什么我们的程序就必须带路径呢?有没有什么办法来改变这一情况?
当然可以!只要把我们的程序放入情况变量PATH中就可以了.
指令:
- export PATH=$PATH:mybin所在的路径
复制代码
5.测试HOME
在讲述Linux指令时,我们有提到过cd ~这个指令。它可以带我们回抵家目录。当你用root用户和普通用户会到的家目录是不同的,这就与HOME有关了。
6. 和情况变量有关的指令
上文我们已经介绍了env
和echo了,接下来再介绍3个干系的指令:
- export:设置一个新的情况变量。
- unset:清除情况变量。
- set:显示当地定义的shell变量和情况变量。
7.情况变量的构造方式
每个变量都会收到一张情况表,情况表是一个字符数组,每个指针指向一个亿\0结尾的情况字符串。
8. 通过代码获取情况变量
在一些册本中,C语言的main话函数是有参数的
- int main(int argc,char* argv[],char* env
- []){}
复制代码 它们分别都是什么呢?
第一个参数argc:表示argv数组中存放的字符指针个数。
第二个参数argv:存储的是干系的字符指针,指针指向的是一个个字符串。
我们先来测试前两个吧。
- #include <stdio.h>int main(int argc,char* argv[],char* env
- []){ printf("argc = %d\n",argc); int i = 0; for(i = 0;argv[i];++i){ printf("argv[%d] = %s\n",i,argv[i]); } printf("test PATH\n"); return 0;}
复制代码
从实验的结果来看,argv数组的第一个指针指向的内容为可执行程序的文件名,第二个开始的指针指针指向的内容依次为加入后的选项,就是我们在命令行中输入的东西,因为我知道我们在命令行中输入的东西在运行可执行程序的时间,通过是路径+可执行程序,因此,一样寻常情况下,argv中的第一个元素指向的字符串是路径+可执行程序名,后面的内容就依次为命令行中输入的内容。
相识完这个特性后,我们就可以写一个在命令行实现的简单计算器了。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int main(int argc,char* argv[])
- {
- if(argc!=4){
- printf("Usage: %s [-a -s -m -d] first_data second_data\n",argv[0]);
- }
- int a = atoi(argv[2]);
- int b = atoi(argv[3]);
- if(strcmp(argv[1] ,"-a") == 0){
- printf("%d+%d = %d\n",a,b,a+b);
- }
- else if(strcmp(argv[1],"-s") == 0){
- printf("%d-%d = %d\n",a,b,a-b);
- }
- else if(strcmp(argv[1],"-m") == 0){
- printf("%d*%d = %d\n",a,b,a*b);
- }
- else if(strcmp(argv[1],"-d") == 0){
- if(b == 0){
- printf("error!!!\n");return 0;
- }
- printf("%d/%d == %d\n",a,b,a/b);
- }
- return 0;
- }
复制代码
main函数的第3个参数
main函数的第3个参数叫做env
,叫做情况变量。
下面我们来通过代码来看看情况变量:
- #include <stdio.h>int main(int argc,char* argv[],char* env
- []){ int i = 0; for(i = 0;env
- [i];++i){ printf("env
- [%d]:%s\n",i,env
- [i]); } return 0;}
复制代码
通过上面的实验我们可以看到,当执行程序的时间,会给main函数的第3个参数,我们可以直接在程序中遍历env
的数组内容,然后将其打印在显示屏上,查看到体系中所有情况变量后,可通过echo $情况变量进行查看。
通过env
iron变量
env
iron是体系指定的一个变量,声明的时间要加上extern
创建一个项目:
- #include <stdio.h>int main(){ extern char** env
- iron; int i = 0; for(i = 0;env
- iron[i];++i){ printf("%s\n",env
- iron[i]); } return 0;}
复制代码 运行结果:
通过我们的操纵,可以看出env
iron与main函数的第3个参数雷同。
getenv
通过man手册查看getenv
相识完用法后,我们在来写一个项目:
- #include <stdio.h>#include <stdlib.h>int main(){ char* val = getenv
- ("PATH"); printf("%s\n",val); return 0;}
复制代码
9. 情况变量具有全局属性
情况变量可以被子进程继续下去,而普通变量是无法被子进程继续下去的。
- #include <stdio.h>#include <stdlib.h>int main(){ char* env
- = getenv
- ("MYENV"); if(env
- ){ printf("%s\n",env
- ); } return 0;}
复制代码 编译后查看:
没有任何结果,说明该情况变量不存在。
- 导入情况变量export MYENV = "hello world"
- 再次编译运行,发现结果有了,说明情况变量是可以被子进程继续下去的。
我们在体系中随便写一个程序,运行后我们会发现其父进程就是bash。bash是体系创建的一个进程,其可以派生出很多的子进程,体系中几乎所有进程的父进程都是bash,我们要知道的是情况变量是可以被bash派生出来的子进程给继续下去的,而普通变量就没有办法被继续。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |