基本概念:
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,通常具有全局属性。
例如:当我们在写c/c++代码时,我们并不知道所链接的动态静态库在哪里,但照样可以链接成功。这是因为有相关环境变量帮助编译器进行查找。
常见的环境变量
·PHAT*:指定命令的搜索路径
·HOME*:指定用户的主工作目录(及用户登陆到Linux系统中时,默认的目录)
·HISTSIZE*:指保存历史命令记录的条数
·SHELL*:当前的Shell,它的值通常是/bin/bash
查看环境变量的方法
[admin@localhost test]$ echo $HOME //HOME表示你要查看的环境变量名称
/home/admin
测试PATH
先编写一个hello.c文件
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
执行代码:
我们发现我们自己编写的代码执行时要加 ./ ,而在命令行敲其他命令时并不需要。这是为什么呢?原因在于操作系统将那些我们常用的命令放在了一个指定的目录下,我们需要时就可以直接执行。
通过查看和搜索路径有关的环境变量:
可以看出这些路径以冒号隔开,那试想,我们可不可以将我们写的代码的路径添加到PATH中,让我们的代码也可以执行运行。答案是可以的。
从上图可以看出通过修改PATH环境变量可以让我们的代码直接运行了。
还有一种方法,就是将我们的可执行程序拷到PATH的任意目录下,看看可不可行:
这种操作只能切换到root用户才可以,毕竟我们写的代码有可能有风险,随意添加到系统目录中可能会造成一定的危害。所以建议大家不要随意往系统目录中添加东西。
测试HOME
通过下面的例子来对比:
在普通用户下查看HOME环境变量
root用户下查看
普通用户下进入家目录
切换到root用户执行上述操作
我们发现HOME环境变量就等同于 ~,它两内容也一样。
测试HISTSIZE
说明当前保存历史记录命令条数最大为1000条
和环境变量有关的命令
1.echo:显示某个环境变量值
2.export :设置一个新的环境变量
3.env:相似所有环境变量
4.unset:清除环境变量
5.set:显示本地定义的shell变量和环境变量
获取环境变量的方法
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;
}
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;
}
3.通过getpath系统调用获取
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("%s\n",getenv("PATH"));
return 0;
}
环境变量通常具有全局属性
环境变量通常具有全局属性,可以被子进程继承下去
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *env = getenv("MYENV");
if(env)
{
printf("%s\n",env);
}
return 0;
}
运行,发现没有结果,说明该环境变量不存在
通过export 命令修改了环境变量,这下可以执行了。说明,环境变量可以被继承。
想了解更多的,大家可以参考《UNIX环境高级编程》第7章进程环境来学习。