详解环境变量

大家好,我是knight-n。本篇文章将会为大家介绍环境变量。

目录

什么是环境变量

环境变量的作用

常见的环境变量

系统调用

getenv

putenv

​编辑

相关命令

 echo

export

env

unset

set

环境变量的组织方式

获取环境变量

总结


什么是环境变量

环境变量是指在操作系统中用来指定操作系统运行环境的一些参数,例如临时文件夹位置和系统文件夹位置等。它们是在操作系统中具有特定名字的对象,包含了一个或者多个应用程序所将使用到的信息。

我们可以把环境变量看成一个操作系统环境设置的变量,作用于整个系统的用户进程。这些变量通常由操作系统或者其他系统软件在计算机启动时自动加载,可以用于控制计算机的系统行为和操作,影响计算机的各个方面。

环境变量的作用

当我们在Linux下运行自己的程序时通常我们需要指明程序路径。但当我们使用指令时没有指明程序路径,为什么操作系统能找到对应的程序呢?

要想搞清这个问题,我们需要了解当我们在终端输入一个指令时系统会做什么。

首先,系统会检查当前用户的环境变量“PATH”,这是一个包含了一系列目录路径的变量。当用户输入指令时,系统会在这些目录路径中搜索对应的可执行文件。

如果在`PATH`环境变量中找到了对应的可执行文件,系统就会执行该文件,并将用户输入的指令参数传递给它。如果在`PATH`环境变量中没有找到对应的可执行文件,系统通常会提示用户“命令未找到”或类似的错误信息。

因此用户不需要显式地指明程序路径来执行指令,因为系统会自动根据环境变量和路径规则来查找对应的程序。从这个例子我们就可以更深刻的理解环境变量的作用,即为程序提供运行时的环境信息,使得程序能够更加方便、高效地运行。

常见的环境变量

PATH : 指定命令的搜索路径 当用户在命令行中输入一个指令时,系统会在PATH环境变量中列出的目录中查找对应的可执行文件。

HOME : 指定用户的工作目录,即用户登录到系统时所处的默认目录。在Linux系统中,它通常指向用户的主目录。

USER : 用于指定当前登录用户的用户名。

TEMP : 指定临时文件夹的路径。当程序需要创建临时文件时,它会在这个目录下创建。

SHELL :  当前Shell,它的值通常是/bin/bash。

系统调用

getenv

格式:char* getenv(const char *name);

作用:获得指定环境变量的信息,以字符串形式返回。

我们用HOME进行测试:

#include<stdio.h>                                                                                                                                                                                                                
#include<stdlib.h>
int main()
{
   printf("HOME:%s\n",getenv("HOME"));
   return 0;
}

putenv

格式: int putenv(char *string);

作用: 添加一个环境变量,成功返回0,错误返回非0。 参数中的string是一个以 name=value 格式表示的字符串,其中 name 是环境变量的名称,value 是该环境变量应该设置的值。如果环境变量已经存在,putenv 会修改其值;如果环境变量不存在,putenv会添加一个新的环境变量。

注意:使用putenv修改的环境变量只会影响当前进程及其子进程。父进程中的环境变量不会受到影响。

我们写一个简单的程序验证。

#include<stdio.h>
#include<stdlib.h>
int main()
{
   char* string="MYENV=12345";
   putenv(string);
   printf("MYENV: %s\n",getenv("MYENV"));
   return 0;
}

相关命令

 echo

我们可以通过echo命令查看环境变量。

格式: echo $环境变量名;

我们可以在root用户和普通用户下验证一下HOME

export

ecport可以设置一个新的环境变量。

格式:export [-fnp] [变量名]=[变量设置值]

-f:代表[变量名称]中为函数名称。

-n:删除指定的变量。变量实际上并未删除,只是不会输出到后续命令的执行环境中。

-p:列出所有的shell赋予程序的环境变量。

我们以PATH为例

#include<stdio.h>

int main()
{
    printf("hello word\n");
    return 0;
}

我们编写了这样一条简单的程序。当程序执行时输出”hello word"

可以看到当我们不指明程序路径时,系统找不到envtest的可执行程序。我们用export将envtest的路径添加到PATH,我们再次运行envtest程序就被成功执行了。

需要注意的是,使用`export`命令设置的环境变量只对当前的shell会话有效,并不是永久有效。

env

显示所有环境变量

由于篇幅限制在此不放上执行效果,大家可以自己尝试。

unset

清除环境变量

格式 unset 变量名

set

显示本地定义的shell变量和环境变量

与env相同由于篇幅限制在此不放上执行效果,大家可以自己尝试。

环境变量的组织方式

环境变量的组织方式在操作系统是通过一种数据结构来实现的,这种数据结构类似于一个数组或者列表,其中每个元素都是一个环境变量。在Linux系统中,这个数据结构被称为环境表,而指向这个表的指针通常被命名为environ。

environ是一个全局的外部变量,其类型为char,它存储了系统的所有环境变量。这些环境变量在程序执行时可以被访问和修改,以便影响程序的行为。在C语言中,可以通过extern char **environ来声明这个变量,然后通过遍历这个数组来访问和修改环境变量。

获取环境变量

上面我们介绍了通过getenv()获取环境变量。下面我们介绍另两种方式。

通过main函数参数获取

我们知道main函数可以接收两个参数:

argc:这是一个整数,表示传递给程序的命令行参数的数量。argc 至少为1,因为程序名本身总是作为第一个参数传递。 

argv:这是一个指向字符指针的指针,通常声明为 char *argv[] 或 char **argv。argv 数组中的每个元素都是一个指向字符串的指针,这些字符串包含了传递给程序的命令行参数。argv[0] 通常是程序的名字,argv[1] 是第一个命令行参数,依此类推。argv 数组以一个空指针(`NULL`)结束,以标识数组的结束。

其实main函数可以接收第三个参数 ——上文介绍的environ,它是一个指向环境变量数组的指针。environ数组包含了当前进程的环境变量,每个元素都是一个指向以 `null` 结尾的字符串的指针。我们可以通过访问environ获取环境变量。

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

通过第三方变量environ获取

我们在上文介绍了environ:

environ是一个全局的外部变量,其类型为char,它存储了系统的所有环境变量。这些环境变量在程序执行时可以被访问和修改,以便影响程序的行为。在C语言中,可以通过extern char **environ来声明这个变量,然后通过遍历这个数组来访问和修改环境变量。

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

总结

至此,我们对环境变量的介绍结束,感谢您的观看!我们下次见!

  • 71
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

knight-n

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

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

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

打赏作者

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

抵扣说明:

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

余额充值