目录
一、引入环境变量
Linux系统中一切皆文件,指令其实也就是可执行程序。我们发现我们自己写的程序运行,必须加上路径./xxx才可以运行,但是Linux系统命令例如ls本质也是一个可执行程序,为什么它运行不需要加上路径呢?
这是因为在Linux系统中存在一些全局设置,会告诉命令行解释器去哪些路径寻找需要运行的可执行程序。这些全局设置即为环境变量。
环境变量在Linux系统启动时就已经被加载到bash进程(命令行解释器)中了,因此执行ls等命令时不需要带上路径,命令行解释器会自行在环境变量中寻找到对应命令的可执行程序路径。
二、环境变量PATH
上述所引入的环境变量其实是环境变量PATH,通过,使用 $PATH 查看该其内容
发现其中保存了一批路径,以冒号为分隔符。执行ls命令时,命令行解释器就会在这些路径中寻找ls命令可执行程序,找到了就会将该程序加载到内存中并运行,如果没找到则报错 not command
1.将自己的程序拷贝到PATH保存的路径中
将我们自己写的可执行程序拷贝到环境变量PATH保存的路径中,即可不带路径直接执行程序
2.修改环境变量PATH
环境变量PATH是被加载到内存中的,所以我们修改环境变量仅仅在本次系统运行期间有效,重启Linux系统后就会恢复成原样。
环境变量来自于磁盘中的配置文件,每次启动Linux系统时,系统会自动读取该配置文件并将其中的环境变量加载到内存中。
因此如果要永久修改环境变量PATH中保存的路径,需要修改其配置文件才行。
三、其他环境变量
使用env命令查看所有环境变量
1.HOME
环境变量HOME中保存的是当前用户家目录的路径
2.PWD
环境变量PWD中保存的是用户当前所处路径
3.SHELL
环境变量SHELL保存的是命令行解释器所在路径
4.HISTSIZE
环境便令HISTSIZE保存的是一个整数值n,记录历史使用过的n条命令
四、本地变量
我们可以使用export命令来自定义环境变量,unset命令取消环境变量(这些修改都是内存级别的,永久修改需要修改配置文件)
export name=value//自定义新的环境变量
unset name//取消某环境变量
对于没有使用export定义的变量,其不是环境变量,而是本地变量。本地变量通过env查不到,但是可以使用echo命令查看到。
本地变量只有在bash进程内部有效,无法被子进程继承下去,其本身意义不大
五、环境变量在bash进程中的组织方式
环境变量的组织方式和命令行参数一样,bash进程会将这些环境变量保存在字符串数组中,形成一个环境变量表。bash进程的每个子进程都可以获取到这个环境变量表。
六、总结
bash进程在启动时,默认会形成两张表:命令行参数表和环境变量表
命令行参数表中的内容,从用户在命令行中输入得来,形成命令行参数表每个子进程都可获取
环境变量表中的内容,从Linux系统中的配置文件得来,形成环境变量表每个子进程都可获取
七、获取环境变量的其他方式
子进程获取环境变量一共有三种方式:
方式一:可以通过bash进程读取系统的配置文件,子进程再从bash进程获取(即上文所讲述的)
方式二:通过main函数传参,bash进程读取系统的配置文件,父进程bash再将形成的环境变量表传递给子进程中的main函数
方式三:通过函数获取环境变量,bash进程中形成的环境变量表,子进程可以直接通过函数获取