0x00 什么是环境变量
环境变量是操作系统中的一种机制,是用于存储系统级别的配置和用户自定义的配置信息,以供系统和程序使用。还可以在系统和应用程序之间共享数据。环境变量通常是一个键值对,键是环境变量的名称,值是环境变量的值。
当进程启动的时候,他会从父进程中继承一份环境变量。父进程可能是shell进程,也可能是其他进程。子进程可以在运行时修改或者添加新的环境变量,这些变量之后对该进程及其子进程有效,不会影响其他进程。
通常情况下,系统变量中会包含一些系统级别的配置信息,例如系统的搜索路径、语言设置、时区等。
环境变量在操作系统和程序中有很广泛的应用。例如,系统会使用环境变量来定位程序运行说需要的文件、库和配置文件。程序也可以使用环境变量来获取用户自定义的信息,例如数据库的连接,调试开关等。
0x01 环境变量的类型
根据作用范围和设置方式不同,环境变量可以分为几下几种类型:
- 系统环境变量(
System Environment Variables):系统环境变量是由操作系统或者系统管理员设置的环境变量,他们对整个系统或者所有用户都是有效的。系统环境变量通常包含了一些操作系统的配置信息、系统默认的搜索路径,语言设置等。 - 用户环境变量(
User Environment Variables):用户环境变量是由用户个人设置的环境变量,他们只对该用户有效。用户的环境变量通常包含了一些个人的用户习惯和应用程序的配置信息,例如自定义的搜索路径,编辑器配置信息等。 - 进程环境变量(Process Environment Variables):进程环境变量是由进程设置的环境变量,他们只对该进程有效。进程环境变量通常用于传递程序的运行时配置信息,例如程序的启动参数,日志级别等。
Shell变量(Shell Variables):Shell变量通常是由Shell程序设置的环境变量,他们对当前的Shell会话有效。Shell变量通常包含了一些Shell程序的配置信息,例如Shell的提示符,命令历史等。
0x02 如何查看环境变量
在linux系统中,可以通过printenv和env命令来查看环境变量。
这两者的区别在于env不仅可以用展示环境变量,还可以用来操作环境变量,而printenv则只能用来展示环境变量。
0x03 如何修改环境变量
在linux下,可以通过如下的方式来操作环境变量
设置环境变量
使用export命令可以设置环境变量
export MY_VAR=value
上面的命令将创建一个名为MY_VAR的环境变量,并将其值设置为value
修改环境变量
修改一个已经存在的环境变量,同样可以使用export命令
export MY_VAR=newValue
上面的命令会创建一个环境变量,如果变量已经存在,则会更新原有的变量。
删除环境变量
如果需要删除环境变量,可以使用unset命令
unset MY_VAR
上面的命令将在当前环境中删除MY_VAR的环境变量。
永久设置环境变量
如果希望每次登陆系统的时候,都能够自动设置某个环境变量,可以将环境变量添加到shell的配置文件中。例如,在bash shell中,可以将如下行添加到~/.bashrc中
export MY_VAR=value
这样,每次登陆系统,bash shell都会自动将MY_VAR设置为value。
如果只是将命令添加到配置文件的话,是需要使用source命令重新读取shell脚本文件并在当前shell中执行。
source ~/.bashrc
source命令:source命令是Bash shell中的一个内置命令,用于读取指定的shell脚本文件,并在当前shell进程中执行其中的命令。它的作用是将指定的shell脚本文件中的环境变量,函数等内容导入到当前shell的环境中,使得这些内容对当前shell会话中的命令有效。
需要注意的是,使用
export方式设置的环境变量,都是Shell变量,他们只会在当前shell中生效,关闭终端之后就会失效。 如果不想使用这种方式设置系统变量,那么只能通过修改系统环境变量的方式,系统环境变量位于/ect/environment中。但是不推荐这种方式,这种方式会针对所有用户和进程都有效,在使用的时候需要谨慎。
0x04 如何在程序中获取环境变量
C/C++
获取全部环境变量 可以通过获取环境变量表的方式来获取全部的环境变量:
#include<iostream>
#include<cstdlib>
extern char **environ;
int main(){
char **env = environ;
while(*env){
std::cout << *env << std::endl;
++env;
}
}
获取单独环境变量
使用系统调用
getevn函数可以获取某一个具体的环境变量:
#include<iostream>
#include<cstdlib>
int main(int argc,char* argv[]){
if(argc > 1){
char* get_env = argv[1];
char* env_value = std::getenv(get_env);
std::cout<<"the env " << get_env << " is " << env_value << std::endl;
}
}
JAVA
在Java中,可以使用System中的getEnv()来获取环境变量:
import java.util.Map;
public class GetEnv {
public static void main(String[] args) {
Map<String, String> envMap = System.getenv();
System.out.println(envMap);
String path = System.getenv("PATH");
System.out.println(path);
}
}