0


【Linux】环境变量

       🔥🔥 欢迎来到小林的博客!!
      🛰️博客主页:✈️小林爱敲代码
      🛰️博客专栏:✈️ Linux
      🛰️社区 :✈️ 进步学堂
      🛰️欢迎关注:👍点赞🙌收藏✍️留言

文章目录

💖环境变量的基本概念

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

常见的环境变量

常见的环境变量有以下这些
环境变量说明PATH指定命令的搜索路径HOME指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)SHELL当前Shell,它的值通常是/bin/bash。

我们可以输入echo $NAME //NAME表示环境变量名。

查看PATH环境变量

我们输入

echo $PATH

即可

我们就可以看到这些环境变量路径被以冒号分隔起来。

-

测试PATH环境变量

那么PATH环境变量有什么作用呢?我们会发现我们在Linux下执行可执行文件需要带上./,而执行其他命令却不需要。可命令也是一个文件啊,为什么不需要呢?这是因为这些命令文件被加进了PATH路径中。接下来我们来测试一下。

首先,写一个C语言程序,随便写什么都可以。

在这里插入图片描述

然后为这个C语言程序编写一个自动化构建工具,也就是Makefile。

在这里插入图片描述

然后我们编译test.c并不带./执行它,我们发现无法执行它。只能带上./才能执行它。

在这里插入图片描述

那我们也想让直接它直接输入test执行怎么办?很简单,将我们的程序所在路径加进环境变量中即可。

export PATH=$PATH:程序所在路径

,即可输入执行程序直接运行。

查看HOME环境变量

就是查看用户的主工作目录。

在这里插入图片描述

查看SHELL环境变量

在这里插入图片描述

和环境变量相关命令

命令说明echo显示某个环境变量值export设置一个新的环境变量env显示所有环境变量unset清除环境变量set显示本地定义的shell变量和环境变量
echo和export上面说过了,那么我们试试剩下三个。

env

会显示所有的环境变量,咱就说看的脑阔疼。

在这里插入图片描述

set

直接输入set

在这里插入图片描述

一样的,不过显示的是本地的或者shell定义的环境变量。

unset

测试unset之前,我们先增加一个本地的环境变量。本地环境变量只有当前有效,退出终端后就会被清除。

在这里插入图片描述

然后set查看该环境变量

可以在最后一行找到刚刚创建的环境变量。

在这里插入图片描述

然后unset wyl来清除该环节变量。

在这里插入图片描述

然后set查看时,刚刚的环节变量已经被删除了。

在这里插入图片描述

💖环境变量的组织方式

在这里插入图片描述

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

简单来说,environ是一个二级指针,它指向一个数组的首地址,这个数组存放的是char*的指针。数组的最后一个NULL。

通过代码如何获取环境变量

我们可以用main函数的第三个参数 **char *env[]**,这个参数会接受系统的环境变量,我们接收来把它遍历一遍看看。

在这里插入图片描述

然后我们运行程序

在这里插入图片描述

会发现把所有的环节变量打印出来了。

测试代码:

#include<stdio.h>intmain(int argc,char*argv[],char*env[]){int i =0;while(env[i]){printf("%s\n", env[i]);
    i++;}return0;}

通过系统调用获取或设置环境变量

那么我们不用main函数传参,能否获取系统的环境变量呢?我们可以先用

man environ

来看看这个帮助手册。

我们可以发现这里声明了一个二级指针 **environ。这个二级指针指向环境变量表。因为它没有包含在任何头文件里,所以使用时要extern声明。

在这里插入图片描述

然后我们重新修改test.c文件。

在这里插入图片描述

重新执行,发现已经打印了这些环境变量。

在这里插入图片描述

测试代码:

#include<stdio.h>intmain(){int i =0;externchar** environ;while(environ[i]){printf("%s\n", environ[i]);
    i++;}return0;}

💖环境变量通常是具有全局属性的

环境变量通常具有全局属性,可以被子进程继承下去

我们不妨测试一下。不过在测试之前,需要给大家介绍一个函数。

getenv(“环境变量名”) ,这个函数会根据你的环境变量名找到你的环境变量内容并返回。没找到则返回null。

在这里插入图片描述

随后我们运行这个程序。

在这里插入图片描述

我们会发现,这个环境变量不存在。

然后我们执行命令

export NEWENV="hello world"

把环境变量添加进来

在这里插入图片描述

为什么这时候就有结果了呢?因为我们的进程是由bash创建出来的。所以这个进程会继承它父进程(bash)包含的环境变量。我们第一次执行的时候,并没有给系统添加环境变量。所以就会出现无法找到的情况,但是在我们给系统添加了环境变量之后,子进程继承bash的时候也会继承它的环境变量。所以我们添加的变量就被它读取到了。

小疑问:如果只进行NEWENV=“hello world”,不调用export导出,会怎么样?

那么我们试一试。

在这里插入图片描述

答案是,不export,那么依然无法在系统环境变量中找到它。因为

NEWENV=“hello world"

只在本地有效。也就是说在内存中,但并没有添加进系统里。所以无法在系统中找到它。

标签: linux 运维 服务器

本文转载自: https://blog.csdn.net/Lin5200000/article/details/132179703
版权归原作者 林 子 所有, 如有侵权,请联系我们删除。

“【Linux】环境变量”的评论:

还没有评论