引言
当我们想要运行某个程序的时候,我们要在前面加上./,是为了告诉操作系统我们想要运行的程序处于当前文件中。但是在我们使用ls , pwd等变量的时候却不需要,为什么?这就是因为我们接下来要讲的环境变量。
环境变量
1.基本概念:
- 概念:操作系统中用来指定操作系统运行环境的一些参数
- 特性:具有全局性
2.常见的环境变量:
- PATH:制定命令的搜索路径。
- PWD:查看当前步骤所处位置。
3.和环境变量相关的命令:
-
echo:显示某个环境变量的值
-
export:设置一个新的环境变量
-
env:显示所有的环境变量
-
unset:清除环境变量
-
set:显示本地定义的shell和环境变量
如何将我们自己的程序置入环境变量中?(不建议实现,因为可能会污染环境变量)
当我们运行一个二进制程序的时候,我们需要在二进制程序前面加上./,不然无法运行。
- 这是为什么?
因为系统并不知道otto在系统的哪个位置,无法执行otto的二进制程序。 - 如何实现用otto直接运行二进制程序?
将otto所在路径追加到某一个环境变量中
在这里我们将otto所在路径添加到了PATH环境变量中,因此我们可以直接运行otto二进制程序
4.通过代码获取环境变量:
- 命令行第三个参数
#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;
}
- 通过第三方变量environ获取
#include<stdio.h>
int main(int argc, char* argv[])
{
extern char ** environ;//由于environ没有包含在任何头文件中,所以在使用的时候需要用extern声明
int i = 0;
for(; environ[i]; i++)
{
printf("%s\n",environ[i]);
}
return 0;
}
结果:显示该进程所继承的所有环境变量
5.通过系统调用获取或设置环境变量
- putenv
- getevc:获取环境变量
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("%s\n", getenv("PATH"));
return 0;
}
6.(重点)环境变量通常具有全局属性的
环境变量通常具有全局属性,可以被子进程继承下去
下面让我们设置一个本地变量看是否有效果。
#include<stdio.h>
#include<stdlib.h>
int main()
{
char* env = getenv("MYENV");
printf("%s\n", env);
return 0;
}
结果:环境变量不存在。
我们需要用export将MYENV设置为环境变量,我们才能用getenv调用
7.注意:
- 被echo声明的不是环境变量,而被称作本地变量,只存在于当前进程中,无法被继承
- 被export生命的是环境变量,环境变量被子(孙)进程全部继承,这体现了环境变量的全局性。