[Linux]环境变量
文章目录
环境变量的概念
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
环境变量的本质:一张内存级的表,在用户登录系统的时候,为用户形成属于自己的环境变量表。表结构示意图如下:
环境变量是从配置文件中读取获得的。
每一个环境变量都有自己的用途,有的是用于路径搜索,有的是用于身份认证,有的是用于库的查找等等。
查看环境变量
- Linux系统下输入
env
指令查看所有环境变量
其中一些常见的环境变量:
- SHELL : 当前Shell,它的值通常是/bin/bash
- USER:当前用户名
- PWD:当前用户所处的路径
- HOME:当前用户的家目录
- LOGNAME:用户登录时的名字
环境变量中值得注意的是PATH环境变量,他记录了Linux系统中的系统指令程序路径,编程语言的动静态库地址。因此同样是可执行程序我们自己编写的程序需要加路径运行,而系统指令不用,并且编译代码时,不需要关心动静态库的链接问题,因为环境变量中记录了路径,编译器会根据环境变量的路径查找。
- Linux系统下输入
echo $NAME
指令查看特定环境变量,其中NAME是所要查看的环境变量名
说明: 一些特定的环境变量比如LOGNAME不同的用户的环境变量是不同的。
- 编写代码查看环境变量
- 通过main函数的参数查看
main函数是有三个参数的,即使我们不写明,编译器也在编译时自动加上并接收参数,其中第三个参数是一个名为envp的指针数组,其接收的参数就是环境变量。envp的数据中最后一个有效数据的下一个数据是空指针,因此编写如下代码查看环境变量:
c
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[], char *envp[])
{
int i = 0;
for (i = 0; envp[i]; i++)
{
printf("envp[%d]->%s\n", i, envp[i]);
}
return 0;
}
编译后运行程序查看结果:
- 通过全局变量查看
在Linux系统头文件unistd.h
中有一个全局变量,名为environ的二级指针,指向环境变量数据表,environ的数据中最后一个有效数据的下一个数据是空指针。因此编写如下代码查看环境变量:
c
#include <stdio.h>
#include <unistd.h>
int main()
{
extern char** environ; //变量声明
int i = 0;
for (i = 0; environ[i]; i++)
{
printf("environ[%d]->%s\n", i, environ[i]);
}
return 0;
}
编译后运行程序查看结果:
- 调用系统函数查看
Linux系统提供了系统函数getenv来获取特定的环境变量。因此编写如下代码查看环境变量:
c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
char* usr = getenv("USER");
printf("当前用户名为:%s\n", usr);
return 0;
}
getenv函数所在的头文件是stdlib.h
,参数要查看的特定环境变量,编译后运行程序查看结果:
环境变量的加载原理
环境变量是从系统配置文件获取数据的一张内存级的表,在Linux操作系统下每启动一个shell进程,shell进程内部就会执行创建环境变量表的代码,然后从配置文件中获取数据加载到自身创建的环境变量表中。由于我们使用Linux操作系统都是通过shell进行命令行解释然后启动子进程完成功能,因此在Linux操作系统下启动的进程都可以通过main函数的参数获取到环境变量,如下:
说明:
- 修改某个shell进程自身的环境变量表不影响新启动的shell进程。
- 修改所有新启动的shell进程的环境变量需要修改配置文件。
环境变量的添加
- 给当前shell进程添加本地变量
直接输入NAME=VAL
给当前shell进程添加本地变量:
shell进程的本地变量只在shell进程内部有效,由shell启动的子进程都无法接收到本地变量。为了验证子进程无法接收到该本地变量编写如下代码:
c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
char* env = getenv("HELLO");
if (env) printf("%s\n", env);
else printf("该环境变量不存在\n");
return 0;
}
编译运行程序查看结果:
- 给当前shell进程添加全局变量
输入export 本地变量
或者export NAME=VAL
添加全局变量:
export指令会将变量添加到shell进程的环境变量表中,因此shell进程的全局变量可以由shell启动的子进程都接收。(图中myproc进程代码同上)
刷新环境变量
.操作符
. 配置文件名
可以刷新当前shell进程的环境变量,将配置文件中的数据加载到环境变量表中使其生效。
source命令
source 配置文件名
可以刷新当前shell进程的环境变量,将配置文件中的数据加载到环境变量表中使其生效。
配置文件的路径
在Linux系统家目录下的每个用户目录中都会存在两个配置文件.bash_profile
和.bashrc
:
.bash_profile
和.bashrc
文件中都有一些环境变量和加载其他配置文件的shell脚本,shell脚本的功能是到对应的路径下加载配置文件,为用户创建shell进程时就会先加载.bash_profile
和.bashrc
文件然后执行其中的shell脚本完成环境变量的加载。
.bash_profile内容示意图:
.bashrc内容示意图: