欢迎来到小林的博客!!
️博客主页:✈️小林爱敲代码
️博客专栏:✈️ Linux
️社区 :✈️ 进步学堂
️欢迎关注:点赞收藏✍️留言
- 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
- 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
- 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
常见的环境变量有以下这些
环境变量 | 说明 |
---|---|
PATH | 指定命令的搜索路径 |
HOME | 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录) |
SHELL | 当前Shell,它的值通常是/bin/bash。 |
我们可以输入echo $NAME //NAME表示环境变量名。
查看PATH环境变量
我们输入 echo $PATH
即可
我们就可以看到这些环境变量路径被以冒号分隔起来。
测试PATH环境变量
那么PATH环境变量有什么作用呢?我们会发现我们在Linux下执行可执行文件需要带上./,而执行其他命令却不需要。可命令也是一个文件啊,为什么不需要呢?这是因为这些命令文件被加进了PATH路径中。接下来我们来测试一下。
首先,写一个C语言程序,随便写什么都可以。
然后为这个C语言程序编写一个自动化构建工具,也就是Makefile。
然后我们编译test.c并不带./执行它,我们发现无法执行它。只能带上./才能执行它。
那我们也想让直接它直接输入test执行怎么办?很简单,将我们的程序所在路径加进环境变量中即可。
export PATH=$PATH:程序所在路径
,即可输入执行程序直接运行。
查看HOME环境变量
就是查看用户的主工作目录。
查看SHELL环境变量
命令 | 说明 |
---|---|
echo | 显示某个环境变量值 |
export | 设置一个新的环境变量 |
env | 显示所有环境变量 |
unset | 清除环境变量 |
set | 显示本地定义的shell变量和环境变量 |
echo和export上面说过了,那么我们试试剩下三个。
env
会显示所有的环境变量,咱就说看的脑阔疼。
set
直接输入set
一样的,不过显示的是本地的或者shell定义的环境变量。
unset
测试unset之前,我们先增加一个本地的环境变量。本地环境变量只有当前有效,退出终端后就会被清除。
然后set查看该环境变量
可以在最后一行找到刚刚创建的环境变量。
然后unset wyl来清除该环节变量。
然后set查看时,刚刚的环节变量已经被删除了。
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
简单来说,environ是一个二级指针,它指向一个数组的首地址,这个数组存放的是char*的指针。数组的最后一个NULL。
我们可以用main函数的第三个参数 char *env[],这个参数会接受系统的环境变量,我们接收来把它遍历一遍看看。
然后我们运行程序
会发现把所有的环节变量打印出来了。
测试代码:
#include
int main(int argc, char *argv[], char *env[])
{
int i = 0;
while(env[i])
{
printf("%s\n", env[i]);
i++;
}
return 0;
}
那么我们不用main函数传参,能否获取系统的环境变量呢?我们可以先用 man environ
来看看这个帮助手册。
我们可以发现这里声明了一个二级指针 **environ。这个二级指针指向环境变量表。因为它没有包含在任何头文件里,所以使用时要extern声明。
然后我们重新修改test.c文件。
重新执行,发现已经打印了这些环境变量。
测试代码:
#include
int main()
{
int i = 0;
extern char** environ;
while(environ[i])
{
printf("%s\n", environ[i]);
i++;
}
return 0;
}
环境变量通常具有全局属性,可以被子进程继承下去
我们不妨测试一下。不过在测试之前,需要给大家介绍一个函数。
getenv(“环境变量名”) ,这个函数会根据你的环境变量名找到你的环境变量内容并返回。没找到则返回null。
随后我们运行这个程序。
我们会发现,这个环境变量不存在。
然后我们执行命令export NEWENV="hello world"
把环境变量添加进来
为什么这时候就有结果了呢?因为我们的进程是由bash创建出来的。所以这个进程会继承它父进程(bash)包含的环境变量。我们第一次执行的时候,并没有给系统添加环境变量。所以就会出现无法找到的情况,但是在我们给系统添加了环境变量之后,子进程继承bash的时候也会继承它的环境变量。所以我们添加的变量就被它读取到了。
小疑问:如果只进行NEWENV=“hello world”,不调用export导出,会怎么样?
那么我们试一试。
答案是,不export,那么依然无法在系统环境变量中找到它。因为 NEWENV=“hello world"
只在本地有效。也就是说在内存中,但并没有添加进系统里。所以无法在系统中找到它。