【Linux】环境变量

本文详细介绍了环境变量在操作系统中的基本概念,列举了常见的环境变量如PATH、HOME和SHELL,并展示了如何通过编程获取、设置和测试环境变量。此外,还讨论了环境变量的全局属性和继承性,以及getenv和export等命令的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       🔥🔥 欢迎来到小林的博客!!
      🛰️博客主页:✈️小林爱敲代码
      🛰️博客专栏:✈️ 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>
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声明。

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

测试代码:

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

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

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

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

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

在这里插入图片描述

随后我们运行这个程序。

在这里插入图片描述

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

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

在这里插入图片描述

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

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

那么我们试一试。

在这里插入图片描述

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

评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林 子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值