【Linux】环境变量

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

文章目录

  • 环境变量的基本概念
    • 常见的环境变量
    • 和环境变量相关命令
  • 环境变量的组织方式
    • 通过代码如何获取环境变量
    • 通过系统调用获取或设置环境变量
  • 环境变量通常是具有全局属性的

环境变量的基本概念

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

常见的环境变量

常见的环境变量有以下这些

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

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

查看PATH环境变量

我们输入 echo $PATH 即可

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

【Linux】环境变量_第1张图片

测试PATH环境变量

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

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

【Linux】环境变量_第2张图片

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

【Linux】环境变量_第3张图片

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

【Linux】环境变量_第4张图片

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

export PATH=$PATH:程序所在路径 ,即可输入执行程序直接运行。

查看HOME环境变量

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

【Linux】环境变量_第5张图片

查看SHELL环境变量

【Linux】环境变量_第6张图片

和环境变量相关命令

命令 说明
echo 显示某个环境变量值
export 设置一个新的环境变量
env 显示所有环境变量
unset 清除环境变量
set 显示本地定义的shell变量和环境变量

echo和export上面说过了,那么我们试试剩下三个。

env

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

【Linux】环境变量_第7张图片

set

直接输入set

【Linux】环境变量_第8张图片

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

unset

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

在这里插入图片描述

然后set查看该环境变量

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

【Linux】环境变量_第9张图片

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

在这里插入图片描述

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

【Linux】环境变量_第10张图片

环境变量的组织方式

【Linux】环境变量_第11张图片

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

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

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

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

【Linux】环境变量_第12张图片

然后我们运行程序

【Linux】环境变量_第13张图片

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

测试代码:

#include 
int main(int argc, char *argv[], char *env[])
{
 int i = 0;
 while(env[i])
 {
 	printf("%s\n", env[i]);
    i++;
 }
 return 0;
}

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

那么我们不用main函数传参,能否获取系统的环境变量呢?我们可以先用 man environ 来看看这个帮助手册。

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

【Linux】环境变量_第14张图片

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

【Linux】环境变量_第15张图片

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

【Linux】环境变量_第16张图片

测试代码:

#include 
int main()
{
 int i = 0;
 extern char** environ;
 while(environ[i])
 {
 	printf("%s\n", environ[i]);
    i++;
 }
 return 0;
}

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

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

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

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

【Linux】环境变量_第17张图片

随后我们运行这个程序。

【Linux】环境变量_第18张图片

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

然后我们执行命令export NEWENV="hello world"把环境变量添加进来

【Linux】环境变量_第19张图片

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

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

那么我们试一试。

【Linux】环境变量_第20张图片

答案是,不export,那么依然无法在系统环境变量中找到它。因为 NEWENV=“hello world"只在本地有效。也就是说在内存中,但并没有添加进系统里。所以无法在系统中找到它。

你可能感兴趣的:(Linux之路,linux,运维,服务器)