环境变量是什么?
环境变量一般指的是在操作系统中用来指定操作系统运行环境的一些参数的变量。
例:我们在编写C/C++代码时,需要链接动态/静态库,但是我们不知道这些库在哪,也可以链接成功,生成可执行程序,原因就是有相关的环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,在系统通常具有全局特性。
常见的环境变量有哪些?
PATH | 指定命令的搜索路径(去路径目录中搜索可执行程序) |
HOME | 指定用户的主工作目录(即用户登录到 Linux 系统中时,默认的目录) |
SHELL | 当前的Shell,它的值通常是/bin/bash |
查看环境变量的方法
echo $NAME
//NAME:指的是你的环境变量名称
和环境变量相关的指令
echo | 显示某个环境变量值 |
export | 设置一个新的环境变量 |
env | 显示所有的环境变量 |
unset | 清除环境变量 |
set | 显示本地定义的shell变量和环境变量 |
环境变量的组织方式
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以‘\0’结尾的环境字符串。
(图有点丑,不要介意,hhhh)
如何通过代码获取环境变量?
两个方法:
1、通过命令行第三个参数
#include <stdio.h>
int main(int argc,char *argv[],char *env[])
{
int i = 0;
for(; env[i]; ++i)
{
printf("%s\n",env[i]);
}
return 0;
}
for 循环中循环条件evn[i]表示:env[i] != NULL;
2、通过第三方变量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;
}
通过这两个代码得到的结果一致。
⚠️:libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern来声明。
如何通过系统调用来获取环境变量?
常用getenv和putenv函数来访问特定的环境变量。
拿getenv来举例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%s\n",getenv("PATH"));
return 0;
}
结果如下:
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/LXY/.local/bin:/home/LXY/bin:hello:./hello
环境变量的全局性质
#include <stdio.h>
#include <stdlib.h>
int main()
{
char * env = getenv("MYENV");
if(env)
{
printf("%s\n",env);
}
return 0;
}
通过代码直接查看,发现没有结果,说明该环境变量根本不存在。
但是!!!!
输入指令:
export MYENV="hello world"
导出环境变量之后,再次运行程序,发现有结果了!
说明:环境变量是可以被子进程继承下去,环境变量具有全局性。