概念
简单来说,环境变量的是用来定义系统运行环境的一些参数。环境变量名称一般都是大写。环境变量是在进程虚拟地址空间里存放的。
常见的环境变量
- HOME:保存用户家目录的环境变量。
- SHELL:保存当前使用的命令行解释器的名称。
- PATH:保存可执行程序的路径的环境变量。
- LD_LIBRARY_PATH:程序运行时,依赖库文件的搜索路径的环境变量。
- CPLUS_INCLUDE_PATH:可以定义第三方C++头文件所在路径的环境变量。
常用命令
- echo $[环境变量名称]:可以查看某一个环境变量的值(内容)。
- env:查看当前操作系统中环境变量的名称和环境变量的值。
- export:可以更改或者增加环境变量。
例如:export [环境变量名称]=$[环境变量名称]:[新增加的环境变量的值]
。但是如果在命令行中直接运行,则export是临时生效的。
更改环境变量
- 比如我们会遇到这样一种情况:在Linux终端下,我在自己的某一个写代码的目录下写了一个 hello world 程序,编译后在本目录下运行能够正常输出,但如果切换到家目录下再运行就不能够运行。那问题来了,为什么 ls 命令能够在所有的目录下运行(ls 本身也是一个程序)。那是因为系统的环境变量里保存了ls程序所在的路径。所以想要自己的程序也能够直接输入程序名称就能在任意目录下运行,就可以通过 export 增加环境变量。
- 比如我在 /home/peng/study/Linux/test 目录下写的程序,想要在 ~ 目录下运行,可以在命令行输入
export PATH=$[PATH]:home/peng/study/Linux/test
然后回车,就可以了,但是这种方法是临时有效的。重启终端后就不会生效了。 - 想要永久生效,就需要将更改环境变量的值写入到环境变量文件中去。注意注意注意,重要的事说三遍,一般不要更改系统的环境变量文件,我们一般都是更改我们用户自己的环境变量。 在我自己的机器上(Ubuntu20.04),系统的环境变量在 /etc/bash.bashrc 里。而我自己的环境变量文件在 ~/.bashrc 里。更改后就可以做到永久生效,每次重新打开一个终端的时候,操作系统都会帮我们加载环境变量文件,从而更改的环境变量内容也被加载到环境变量中去了。注意更改完毕后需要使用命令
source + 更改的环境变量文件
使其生效。大家自行测试。
获取环境变量
除了用命令 env 获取系统环境变量,还可以利用代码获取。
第一种方法:利用 main 函数的参数获取环境变量。
int main(int argc, char* argv[], char* env[])
{
//argc --> 命令行参数个数
//argv --> 命令行参具体的内容
//env --> 环境变量
//char* env[]
//env[0] = xxx
//env[1] = yyy
//env[2] = xxx
//env[n] = NULL //最后一个环境变量用NULL标识
for(int i = 0; env[i]; i++)
{
printf("%s\n", env[i]);
}
return 0;
}
第二种方法:利用 libc 库当中提供的变量来获取。
int main()
{
//libc 库
extern char** environ;
for(int i = 0; environ[i]; i++)
{
printf("%s\n", environ[i]);
}
return 0;
}
第三种方法:利用 libc 库提供的函数getenv()
来获取一个具体的环境变量的值。要引入 stdlib.h 头文件。
int main()
{
//libc 库当中提供的 函数老获取某一个具体的环境变量的值
//库函数
//char *getenv(const char *name);
// name : 环境变量的名称
// 返回值:具体环境变量所对应的值
char* PATH = getenv("PATH");
printf("PATH=%s\n", PATH);
return 0;
}