基本概念

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

构成:环境变量是一系列字符串的统称,所以一个环境变量由变量名构成

这么说还是太抽象了,我们接下来会举几个具体样例,体会环境变量在获取系统全局的变量,系统指令路径等方面的作用

常见环境变量

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

操作系统变量

查看环境变量

echo $NAME NAME为变量名

PATH为例,查看PATH的值的指令为

1
echo $PATH

https://picbed0521.oss-cn-shanghai.aliyuncs.com/blogpic/PixPin_2024-07-08_12-46-35.png

可以看到PATH的内容为多个文件路径,互相以:分隔

而若要查看当前的全部环境变量,可以使用env指令,将当前所有环境变量打印在终端上

也可以通过管道grepenv的输出内容过滤

查看PATH

1
env | grep PATH

同时还有个set 指令可以显示本地定义的shell变量和环境变量环境变量的组织方式

获取进程的环境变量

  • 在程序中,可以使用getenv()接口获取对应环境变量名的对应环境变量值

getenv<stdlib.h>

1
2
3
4
5
6
7
8
#include <stdio.h>
#include <stdlib.h>

int main()
{
printf("PATH: %s\n",getenv("PATH"));//打印PATH的值
return 0;
}

环境变量的组织方式

每个进程都有自己的环境表,所谓环境表就是一个字符指针数组,每个不为NULL的指针指向环境字符串

https://picbed0521.oss-cn-shanghai.aliyuncs.com/blogpic/PixPin_2024-07-08_20-52-19.png

  • 因此也可以使用main函数传参来打印所有环境变量的内容
    1
    2
    3
    4
    5
    6
    7
    int main(int argc,char* argv[],con char* env[])
    {
    char* str;
    int i = 0;
    while(str =env[i++]) printf("%s\n",str);
    return 0;
    }

导入环境变量

头文件unistd.h>提供了一个全局变量environ,因此可以用extern导入环境变量

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <unistd.h>

extern char **environ;//导入换进变量

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

添加新的环境变量

使用export命令可以添加新的环境变量

使用方法:export``=``(变量值)

例如添加一个值为supdriver666,名为MY_VALUE的环境变量,最后查看该变量

1
2
3
export MY_VALUE=supdriver666

env | grep MY_VALUE

程序内设置换进变量

使用<stdlib.h>提供的putenv()接口可以设置环境变量,用法与export指令相同

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>

int main()
{
putenv("MY_VALUE=666");
printf("MY_VALUE = %s",getenv("MY_VALUE"));
return 0;
}

删除环境变量

使用unset可以删除环境变量

删除上文的MY_VALUE

1
2
3
unset MY_VALUE

env | grep MY_VALUE

可以看到没有输出了

添加本地shell变量 和 查看本地变量与环境变量

添加本地变量: 直接输入(变量名)``=``(值) //不加空格/

查看变量: 使用set命令查看本地变量与环境变量,但是内容非常多,建议搭配grep等使用

1
2
3
4
5
my_value=2024

set

set | grep my_value

本地变量与环境变量

二者最大的差别是环境变量可以被子进程继承,而本地变量只在本BASH内部有效,不会被继承