文章目录
- 环境变量概念
- 查看环境变量
- 设置环境变量
- 代码获取环境变量
- 补充说明
环境变量概念
定义 :环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
个人理解:Linux下一切皆文件,在Linux中所用的指令其实都是一个个可执行文件,例如ls
指令,他的路径为 /bin/ls
, 用户直接输入ls
即可运行该文件, 那么为什么用户自己用代码编写生产的可执行文件,要用路径/文件名
的格式才能执行,而像 ls
这样的指令不需要呢? 因为系统的环境变量,为 ls
提供了运行环境的参数,或者说帮助该指令查到了其可执行文件所在的位置 。
常见的环境变量有:
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。
! : 环境变是一个 KET=VALUE
形式的键值对 ;
查看环境变量
指令:
- echo: 显示某个环境变量值($代表后面的字符串是个变量名)
echo $KEY
- env: 显示所有环境变量
- set: 显示本地定义的shell变量和环境变量
设置环境变量
- export: 设置一个新的环境变量
export KET=VALUE
- unset: 清除环境变量
- putenv (在C代码中执行的函数)
`int putenv(char *string);`
#include <stdio.h>
#include <stdlib.h>
int main() {
if (putenv("MYVAR=Hello") == 0) // 环境变是一个 `KET=VALUE` 形式的键值对
{
printf("Environment variable set successfully\n");
} else
{
printf("Failed to set environment variable\n");
}
return 0;
}
- 通过配置文件设置永久生效的环境变量
前面的环境变量设置方法,在重启xshell以后会失效,将环境变量添加到~/.bashrc
或~/.bash_profile
文件中,这样每次登录时都会加载这些环境变量。因为除非自己手动删除否则永久生效,所以要谨慎配置。
进入配置文件
vi ~/.bashrc
在文件末尾添加:
export 变量名=变量值
例如:
export MY_VAR=hello
保存并退出文件,然后执行以下命令使其生效:
source ~/.bashrc
这样,每次登录时都会自动加载这些环境变量。
代码获取环境变量
- 通过main函数参数获取
#include <stdio.h>
int main(int argc, char *argv[], char *env[]) // env即环境表,环境表在补充说明部分有;
{
int i = 0;
for(; env[i]; i++){
printf("%s\n", env[i]);
}
return 0;
}`
- 通过getenv函数获取
int putenv(char *string);
示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
char *path = getenv("PATH");// PATH 为输入的KEY,返回值为VALUE
if (path != NULL) {
printf("PATH: %s\n", path);
} else {
printf("PATH not found\n");
}
return 0;
}
- 通过第三方变量environ获取
在Linux中,environ是一个指向环境变量的指针数组。它是一个全局变量,存储了当前进程的环境变量信息(环境表,见补充说明部分)。环境变量是一些在操作系统中设置的键值对,用于存储各种配置信息和运行时参数。例如,PATH环境变量用于指定可执行程序的搜索路径。environ指针数组中的每个元素都指向一个以 key=value
格式表示的环境变量字符串。数组的最后一个元素是一个空指针,用于表示数组的结束。通过遍历environ数组,可以获取当前进程的所有环境变量及其对应的值。
#include <stdio.h>
int main(int argc, char *argv[])
{
extern char **environ;
int i = 0;
for(; environ[i]; i++){
printf("%s\n", environ[i]);
}
return 0;
}`
i
补充说明
- 每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串。
- 在终端执行
export MYENV="hello world“
和 直接执行MYENV="hello world“
的区别
export命令用于将普通变量设置为环境变量,环境变量具有全局属性,可以在当前会话中的所有子进程中访问到。而直接执行变量赋值语句设置普通变量,如MYENV=“hello world”,则只在当前shell进程中有效,不会被子进程继承。
- 由于环境变量的全局属性,父进程的环境变量可以被子进程继承 。