Linux——情况变量

打印 上一主题 下一主题

主题 1932|帖子 1932|积分 5796

当我们在Linux操纵体系进行操纵时,我们会发现使用体系命令的时间,像 cd ls pwd等等,通常不须要带对应的路径,只须要写对应的名字就可以了,而我们本身写的程序在运行时却必须要带上路径。这就和我们今天要学的情况变量中的 PATH有关了。
1.什么是情况变量

情况变量(env
ironment variables)一样寻常是指在操纵体系中用来指定体系运行情况的一些参数,就好比:我们在编写C/C++代码时间,在链接的时间,从来不知道我们所链接的动静态库在哪里,但是照样可以链接乐成,生成可执行程序,原因就是干系情况变量资助编译器进行查找。情况变量通常具有某些特殊的用途,还有在体系当中通常具有全局属性。
2.常见情况变量



  • PATH:指定命名的搜刮路径
  • HOME:指定用户的主工作目录(及用户登录到Linux体系时,默认的目录)
  • SHELL:当前Shell,它的通常值是/bin/bash.
3. 如何查看情况变量

查看所有情况变量语法:
  1. env
复制代码
演示:

查看特定的情况变量语法:
  1. echo $NAME //NAME为你环境变量的名称
复制代码
查看PATH:

4. 测试PATH

先写一段代码:
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     printf("test PATH\n");
  5.     return 0;
  6. }
  7. //形成的可执行文件为mybin
复制代码
makefile:
  1. mybin:test.c
  2.         gcc -o mybin test.c
  3. .PHONY:clean
  4. clean:
  5.         rm -f mybin
复制代码
通过测试我们可以发现,当我们输入./mybin才可以运行这个代码,而直接输入mybin是无法运行的。
为什么我们的程序就必须带路径呢?有没有什么办法来改变这一情况?
当然可以!只要把我们的程序放入情况变量PATH中就可以了.
指令:
  1. export PATH=$PATH:mybin所在的路径
复制代码

5.测试HOME

在讲述Linux指令时,我们有提到过cd ~这个指令。它可以带我们回抵家目录。当你用root用户和普通用户会到的家目录是不同的,这就与HOME有关了。
6. 和情况变量有关的指令

上文我们已经介绍了env
和echo了,接下来再介绍3个干系的指令:

  • export:设置一个新的情况变量。
  • unset:清除情况变量。
  • set:显示当地定义的shell变量和情况变量。
7.情况变量的构造方式

每个变量都会收到一张情况表,情况表是一个字符数组,每个指针指向一个亿\0结尾的情况字符串。

8. 通过代码获取情况变量

在一些册本中,C语言的main话函数是有参数的
  1. int main(int argc,char* argv[],char* env
  2. []){}
复制代码
它们分别都是什么呢?
第一个参数argc:表示argv数组中存放的字符指针个数。
第二个参数argv:存储的是干系的字符指针,指针指向的是一个个字符串。
我们先来测试前两个吧。
  1. #include <stdio.h>int main(int argc,char* argv[],char* env
  2. []){    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中的第一个元素指向的字符串是路径+可执行程序名,后面的内容就依次为命令行中输入的内容。
相识完这个特性后,我们就可以写一个在命令行实现的简单计算器了。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main(int argc,char* argv[])
  5. {
  6.     if(argc!=4){
  7.         printf("Usage: %s [-a -s -m -d] first_data second_data\n",argv[0]);
  8.     }
  9.     int a = atoi(argv[2]);
  10.     int b = atoi(argv[3]);
  11.     if(strcmp(argv[1] ,"-a") == 0){
  12.         printf("%d+%d = %d\n",a,b,a+b);
  13.     }
  14.     else if(strcmp(argv[1],"-s") == 0){
  15.         printf("%d-%d = %d\n",a,b,a-b);
  16.     }
  17.     else if(strcmp(argv[1],"-m") == 0){
  18.         printf("%d*%d = %d\n",a,b,a*b);
  19.     }
  20.     else if(strcmp(argv[1],"-d") == 0){
  21.         if(b == 0){
  22.             printf("error!!!\n");return 0;
  23.         }
  24.         printf("%d/%d == %d\n",a,b,a/b);
  25.     }
  26.     return 0;
  27. }
复制代码

main函数的第3个参数

main函数的第3个参数叫做env
,叫做情况变量。
下面我们来通过代码来看看情况变量:
  1. #include <stdio.h>int main(int argc,char* argv[],char* env
  2. []){    int i = 0;    for(i = 0;env
  3. [i];++i){        printf("env
  4. [%d]:%s\n",i,env
  5. [i]);    }    return 0;}
复制代码

通过上面的实验我们可以看到,当执行程序的时间,会给main函数的第3个参数,我们可以直接在程序中遍历env
的数组内容,然后将其打印在显示屏上,查看到体系中所有情况变量后,可通过echo $情况变量进行查看。
通过env
iron变量

env
iron是体系指定的一个变量,声明的时间要加上extern
创建一个项目:
  1. #include <stdio.h>int main(){    extern char** env
  2. iron;    int i = 0;    for(i = 0;env
  3. iron[i];++i){        printf("%s\n",env
  4. iron[i]);    }    return 0;}
复制代码
运行结果:

通过我们的操纵,可以看出env
iron与main函数的第3个参数雷同。
getenv

通过man手册查看getenv


相识完用法后,我们在来写一个项目:
  1. #include <stdio.h>#include <stdlib.h>int main(){    char* val = getenv
  2. ("PATH");    printf("%s\n",val);    return 0;}
复制代码

9. 情况变量具有全局属性

情况变量可以被子进程继续下去,而普通变量是无法被子进程继续下去的。
  1. #include <stdio.h>#include <stdlib.h>int main(){    char* env
  2. = getenv
  3. ("MYENV");    if(env
  4. ){        printf("%s\n",env
  5. );    }    return 0;}
复制代码
编译后查看:

没有任何结果,说明该情况变量不存在。


  • 导入情况变量export MYENV = "hello world"
  • 再次编译运行,发现结果有了,说明情况变量是可以被子进程继续下去的。

我们在体系中随便写一个程序,运行后我们会发现其父进程就是bash。bash是体系创建的一个进程,其可以派生出很多的子进程,体系中几乎所有进程的父进程都是bash,我们要知道的是情况变量是可以被bash派生出来的子进程给继续下去的,而普通变量就没有办法被继续。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表