我可以不吃啊 发表于 2024-10-3 10:07:46

Linux——情况变量

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

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



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

查看所有情况变量语法:
env
演示:
https://i-blog.csdnimg.cn/direct/33270d6f697c4fe9a4eec5917e1f7472.png
查看特定的情况变量语法:
echo $NAME //NAME为你环境变量的名称
查看PATH:
https://i-blog.csdnimg.cn/direct/5073d1280f2348b39f385f7ef07c6a04.png
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所在的路径
https://i-blog.csdnimg.cn/direct/1e3f1940435b4fbcab57b22ccea9cf4d.png
5.测试HOME

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

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

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

每个变量都会收到一张情况表,情况表是一个字符数组,每个指针指向一个亿\0结尾的情况字符串。
https://i-blog.csdnimg.cn/direct/f03f1deaef534f31ba637092f74cddba.png
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){      printf("argv[%d] = %s\n",i,argv);    }    printf("test PATH\n");    return 0;} https://i-blog.csdnimg.cn/direct/0ed2d96985f34a699eef5bfcaa16cdc8.png
从实验的结果来看,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);
    }
    int a = atoi(argv);
    int b = atoi(argv);
    if(strcmp(argv ,"-a") == 0){
      printf("%d+%d = %d\n",a,b,a+b);
    }
    else if(strcmp(argv,"-s") == 0){
      printf("%d-%d = %d\n",a,b,a-b);
    }
    else if(strcmp(argv,"-m") == 0){
      printf("%d*%d = %d\n",a,b,a*b);
    }
    else if(strcmp(argv,"-d") == 0){
      if(b == 0){
            printf("error!!!\n");return 0;
      }
      printf("%d/%d == %d\n",a,b,a/b);
    }
    return 0;
}

https://i-blog.csdnimg.cn/direct/090ee29c00c447efb4e3f5d432dacb74.png
main函数的第3个参数

main函数的第3个参数叫做env
,叫做情况变量。
下面我们来通过代码来看看情况变量:
#include <stdio.h>int main(int argc,char* argv[],char* env
[]){    int i = 0;    for(i = 0;env
;++i){      printf("env
[%d]:%s\n",i,env
);    }    return 0;} https://i-blog.csdnimg.cn/direct/38c31ceb42e643db900d30821cc2f454.png
通过上面的实验我们可以看到,当执行程序的时间,会给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){      printf("%s\n",env
iron);    }    return 0;} 运行结果:
https://i-blog.csdnimg.cn/direct/f57722ab478f407894dfd7a7b7baa49c.png
通过我们的操纵,可以看出env
iron与main函数的第3个参数雷同。
getenv

通过man手册查看getenv

https://i-blog.csdnimg.cn/direct/23e10be558be4aad90cc4891845d00b5.png
相识完用法后,我们在来写一个项目:
#include <stdio.h>#include <stdlib.h>int main(){    char* val = getenv
("PATH");    printf("%s\n",val);    return 0;} https://i-blog.csdnimg.cn/direct/f7f00ae9fa904d3dbcf9ee2c3b308dac.png
9. 情况变量具有全局属性

情况变量可以被子进程继续下去,而普通变量是无法被子进程继续下去的。
#include <stdio.h>#include <stdlib.h>int main(){    char* env
= getenv
("MYENV");    if(env
){      printf("%s\n",env
);    }    return 0;} 编译后查看:
https://i-blog.csdnimg.cn/direct/99293e63be7a4ac88dcf65a8e54e0d74.png
没有任何结果,说明该情况变量不存在。


[*]导入情况变量export MYENV = "hello world"
[*]再次编译运行,发现结果有了,说明情况变量是可以被子进程继续下去的。
https://i-blog.csdnimg.cn/direct/37ff03c2605f413585e065b3de7b83ac.png
我们在体系中随便写一个程序,运行后我们会发现其父进程就是bash。bash是体系创建的一个进程,其可以派生出很多的子进程,体系中几乎所有进程的父进程都是bash,我们要知道的是情况变量是可以被bash派生出来的子进程给继续下去的,而普通变量就没有办法被继续。

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