Linux环境变量个人笔记
基本概念环境变量(environment variables)是用来指定操作系统运行环境的一些参数。我们在编写C/C代码的时候在链接时虽然不知道链接的动态静态库在哪里但照样可以链接成功生成可执行程序原因就是有相关环境变量帮助编译器进行查找。 环境变量在系统中具有全局特性。常见环境变量PATH: 指定命令的搜索路径。我们平时直接输入pwd而不需要带上这个命令的地址是因为pwd指令的地址已经被存储到PATH当中系统会自动遍历PATH中的地址寻找pwd。HOME: 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)SHELL: 当前Shell,它的值通常是/bin/bash使用”echo $环境变量名“打印环境变量的信息分别使用两个不同的用户对HOME进行测试环境变量有关指令echo: 显示某个环境变量值export:设置一个新的环境变量env: 显示所有环境变量unset: 清除环境变量 HOME 的关系set: 显示本地定义的shell变量和环境变量环境变量的组织方式每个程序都会收到一张环境表环境表是一个字符指针数组每个指针指向一个以’\0’结尾的环境字符串。这张环境表是通过命令行解析得到的。命令行解析命令其实是由程序实现的是程序就会有main函数而main函数其实是可以有参数的。对于操作系统而言我们输入的命令就是字符串命令行会被Shell拆散成一个个字符串再把这些字符串传给main函数,这就是命令行解析命令行解析具体工作流程在终端输入./test并回车时Shell 做了以下几件事读取输入Shell 读取你输入的字符串./test。解析命令行Shell 通过空格分割字符串得到参数列表。argc 1只有一个参数./test。argv[0] ./test。查找可执行文件因为命令以./开头Shell 直接定位到当前目录下的test文件跳过 PATH 搜索。创建子进程并执行Shell 调用fork()创建子进程。子进程调用execve(./test, argv, env)。execve是系统调用它会加载./test程序到内存。将 Shell 的环境变量env复制一份给新程序。跳转到test程序的main函数入口这里补充一下main函数的参数形式无参数、带命令行参数此外还有带环境变量参数继续上面的例子假如我们输入的是./test时argc是1,因为接收到一个命令然后argv[0]存放的就是指向./test地址字符串的指针。获取环境变量的方式下面代码演示获取环境变量的方式用字符指针数组打印所有环境变量用Printenv来查看所有环境变量使用getenv()函数在程序中获取环境变量并打印环境变量的全局性环境变量通常具有全局属性可以被子进程继承下去下面代码示例在未向shell中添加自定义环境变量时子进程提示无法找到MYENV向shell中添加自定义环境变量后子进程能够找到该环境变量从而证明了环境变量的全局属性