基本概念
一般指在操作系统中用来指定操作系统运行环境的一些参数
如c/c++链接的时候我们不知道动静态库在哪里,照样可以连接成功,原因就是有相关环境编译帮助编译器查找
环境变量有特殊用途,在系统中通常具有全局属性
常见环境变量
PATH:指定命令的搜索路径
HOME:指定用户的主工作目录(用户登录到系统中,默认的目录)
SHELL:当前shell,通常是/bin/bash
查看环境变量
echo $NAME //NAME环境变量名
为什么系统命令可以直接运行,自己的程序必须带路径,因为在上面的环境变量里存了命令的路径
添加自己的文件路径到环境变量就可以运行自己的程序
export PATH=$PATH: 路径名
PATH=路径,可以设置PATH默认路径
这时就可以找到我们的程序,也可以不加路径运行。但环境变量都保存在配置文件里,每次登录都会重置,不建议修改配置文件,可能会污染环境变量
输入env可以查看所有环境变量
env
相关命令
echo:显示某个环境变量
export:设置一个新的环境变量
env:显示所有环境变量
unset:清除环境变量
set:显示本地定义的shell变量和环境变量
环境变量的组织方式
每个程序都会收到一个环境表,字符指针数组,每个指针指向一个字符串
获取环境变量
代码获取
main函数的第三个参数
#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;int i = 0;for(; environ[i]; i++){printf("%s\n", environ[i]);}return 0;
}
libc中定义的全局变量environ指向环境变量表,没有包含在任何头文件中,所以要extern声明
通过系统调用或设置
getenv
#include <stdio.h>
#include <stdlib.h>
int main()
{printf("%s\n", getenv("PATH"));return 0;
}
环境变量哪来的
子进程的环境变量都是从父进程继承来的,默认,所有的环境变量都会被子进程继承。最开始的命令行命令是从bash来的
证明这个结论
导出一个自定义的环境变量,会给bash增加一个环境变量,export是可以被子进程继承的
#include <stdio.h>2 #include <unistd.h>3 #include <sys/types.h>4 #include <stdlib.h>5 6 int main()7 {8 printf("%s\n",getenv("class")); 9 return 0; 10 }
bash的子进程获取这个创建的环境变量
环境变量具有全局属性
如果不加export就是一个普通/局部变量,并不是环境变量,找不到
set可以查看所有变量
main函数的argc是命令行参数的个数,argv是具体的每个命令行
运行程序时可以传入,可以根据命令行的不同同样的程序运行不同的功能,由自己调用的时候传入,bash先拿到,然后传给的程序