1. 基本概念
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但
是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性(父进程可以将环境变量传给子进程)
注意:
我们运行的进程都是子进程,而 bash进程启动时,会从操作系统的配置文件中读取环境变量信息,而子进程从父进程得到环境变量信息
2. 常见环境变量
- env
查看环境变量
- PATH : 指定命令的搜索路径
举例
ls -l 中 ls 也是一个进程,但是我们没有通过相对路径或者绝对路径来寻找它
这里就跟环境变量中的PATH有关
编译器会从这些路径里面查找需要执行的进程
每一个 : 就是一个路径分隔符
- HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
- SHELL : 当前Shell,它的值通常是/bin/bash
a. 查看环境变量方法
- echo $NAME (环境变量名称)
查看某个环境变量
b. 测试PATH
在PATH中添加路径
- export PATH=$PATH: 需要添加的路径
我们发现,添加进去后,不需要加相对路径或绝对路径,也可以找到 tmp进程
c. 测试HOME
用 root 和普通用户,分别执行 echo $HOME ,对比差异
3. 和环境变量相关的命令
1. echo:
显示某个环境变量值
2. export:
设置一个新的环境变量
3. env:
显示所有环境变量
4. unset:
清除环境变量
5. set:
显示本地定义的shell变量和环境变量
a. 环境变量的组织方式
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
b. 通过代码如何获取环境变量
- 命令行第三个参数
- 通过第三方变量environ获取
注意:
libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明
c. 通过系统调用获取或设置环境变量
4. 环境变量通常是具有全局属性的
- 环境变量通常具有全局属性,可以被子进程继承下去
5. 本地变量
只在 bash进程 内部有效,不会被子进程继承
命令:
- 常规命令 -- 通过创建子进程完成的
- 内建命令 -- bash 不创建子进程,而是由自己亲自执行,类似 bash 调用了自己写的,或者系统提供的函数