在linux系统编程中,环境变量的理解和使用是非常重要的。本文将详细探讨环境变量的相关问题,并提供相应的解决方案。
1. 环境变量
1.1 PATH引入
问题1: 我们平时使用的指令也是可执行程序,但为什么可以直接运行,而我们自己编译过的就需要加上./呢?
可执行程序是一个进程,也是一个文件。查找文件时必须提供路径。我们输入的指令程序路径被存储在操作系统可以默认查找的路径下,因此可以直接运行。但我们自己编译的程序位于当前目录下,并不在操作系统默认查找的路径下,所以需要使用相对路径查找。./code.c就是使用相对路径,告诉操作系统我的可执行程序在当前目录下,不用乱找了!
问题2: 操作系统默认查找的路径在哪里存储呢?
–> PATH环境变量中
操作系统默认搜索的路径存储在PATH环境变量中,我们可以通过echo $PATH查看PATH变量,其中:为分隔符。
我们平时使用的指令通常位于/usr/bin目录下。如果直接执行自己的程序,会出现”command not found”,因为-bash命令行在默认的PATH路径下查找过了,没有找到。
问题3: 如果我想将自己的程序像指令一样使用,该如何做呢?
办法就是把我们自己的可执行程序放在默认查找路径中,有两种方法:
问题4: 如何添加PATH呢?
-
PATH=…..: 这种方法是直接对PATH变量赋值,会覆盖掉原来的路径。但即使我们不小心使用了,问题也不大,因为我们的指令都是内存级文件,每次启动shell都会自动加载。
-
PATH=$PATH:…: 这种方法是追加目录,也就是新增路径。
1.2 HOME和SHELL
- HOME环境变量: 通常用于指定用户的主目录,也就是我们登录shell时默认所处的目录。我的默认用户目录就是ubuntu。
- SHELL变量: 存储命令行解释器的所在路径,也就是-bash的路径。
2. 查看所有环境变量的方法
2.1 命令行
2.2 系统调用接口
通过getenv获取指定环境变量。
2.2.1 第三方变量
第三方环境变量:extern char** environ(二级指针)
3. 如何通过环境变量理解权限
我们知道权限的对象是使用者,也就是usr。我们可以通过环境变量获取USER,来判断对应的权限。
4. 命令行参数
4.1 main函数的指令参数
我们的main函数是可以带参数的,因为它也是一个函数。
我们平时所使用的指令也是如此,诸如很多的选项就是这样执行的。
4.2 main函数的环境变量参数
main除了argc和argv外还有环境变量参数–>env。
结论–>两张向量表:
4.3 如何理解环境变量的全局性
我们知道了main函数的参数中是隐含了一张环境变量表的。我们的bash进程中也必然有环境变量表。而我们所使用的进程都是继承自bash,所以环境变量表也会被继承下去,每个进程中都可以使用,因此就相当于全局了。
根据前面的知识,如果是先创建了进程,然后再修改了环境变量,那么新创建的子进程必然会被继承下去(共享数据)。但如果创建了子进程然后修改了环境变量并不会影响父进程的环境变量,因为会发生写时拷贝。
4.4 本地变量和环境变量的区别
问题1: 什么是本地变量?
问题2: 和环境变量有什么区别?
本地变量存储在栈上,而环境变量存储在数据段,也就是全局变量区。
4.5 常规命令和内建命令
之前我们提到过,如果我们不小心将环境变量覆盖了,那么就会导致大部分的指令用不了,但并不是所有的指令都用不了!比如echo、pwd、cd……因为它们是内建命令。
总结
环境变量表本质是一个二级指针。