目录
基本概念
- 环境变量(environmentvariables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数。
- 环境变量通常具有某些特殊⽤途,还有在系统当中通常具有全局特性
用途之一
我们看一个之前说到过的问题:
为什么直接敲指令可以直接运行,而我们自己写的程序却要写路径才能运行?
现象:
我们之前说只需要我们把自己的可执行文件放进/usr/bin/目录下就可以不带路径,但是为什么呢?
这是因为有环境变量。
有一个可执行文件,要运行它,必须要先找到它吧,我们带上路径就能执行,而不带却不能执行,但是系统中的指令却不用带就能执行,为什么?
系统中有一个名叫PATH的环境变量,帮助系统找到可执行的二进制文件!PATH中存着/usr/bin路径(当然不止这一个路径),系统会默认到PATH中的路径寻找输入的指令,如果查遍了PATH中的所有路径都没有查到输入的指令,那么就报错反馈给用户,如果查到了,执行即可!
查所有环境变量,指令:
env

是以名称=内容的形式存放的。
查某个环境变量内容,指令:
ehco $(需要查找的环境变量名)

可以将自己的可执行文件放到PATH路径中,但是我们也可以添加路径到PATH中,这样我们可以解决:


当我们把PATH路径全部修改掉,原来系统指令就执行不了了,但有些内命令能运行,这个内建命令我们后面讲:

我们修改后,不知道怎么恢复,可以直接退出重新登陆,即可恢复原样。
环境变量表
环境变量是怎么来的呢?怎么理解它?它是怎么被存储的?
我们登陆上去,bash从系统中的相关配置文件(shell脚本写的)读取,形成一张环境变量表(数组),也就是说系统中环境变量都在bash的这张环境变量表中!
如果同时登陆10个用户呢?也就是有10个bash,它们都会形成各自的环境变量表(从相关配置文件中读取的)。
环境变量表的存储:
将环境变量以字符串的形式存入环境变量表。
命令行参数表
除了环境变量表,其实还有一张命令行参数表!
在日常生活中,我们常常使用一些命令达不到我们的需求,所以指令一般都有一些参数来实现多功能的需求。
例:

理解:
在bash看来我们敲的一行行指令就是一个字符串,bash将这一个个命令参数切分,放入命令参数表中,通过表上的不同的命令参数执行不同的功能。

理解
直观的看命令行参数表:

命令行参数表其实就是个数组!(main函数最多有三个参数)
有这个命令参数表,我们可以将不同参数实现不同功能:

直观的看环境变量表:

环境变量表和命令行参数表一样是个数组!
综合理解:
我们一登陆,bash读取OS相关配置文件,填写形成环境变量表,当我们敲一个命令时,bash读取命令行,将命令行切分,填写形成命令行参数表,bash会在PATH环境变量的所有路径中,寻找这个指令,如果有,根据参数,运行这个多功能的指令!如果没有,报错给用户。也就是说bash会存在两张表。
有个问题:
这个myprocess进程是bash的子进程,我们说环境变量只是在bash中,怎么这个myprocess进程可以拿到呢?
我们开始讲概念的时候说过,环境变量是具有全局属性的,也就是说,bash中的环境变量表是被子进程继承的,别说子进程,哪怕是bash的孙子进程,曾孙进程也是继承的,具有全局特性!
理解:
我们以为程序的入口是main函数,其实,main函数上一层还有一个start函数,start函数调用main函数,只不过我们看不到start函数,只能看到main函数,所以才以为main函数是程序的入口。
main函数可以是0/1/3个参数,start将参数传入子进程main函数,也就是说start函数是将bash中的环境变量表,命令行参数表传入子进程main函数。
更多的环境变量
我们可以看到有很多个环境变量,现在我们来说说一些常见的。

HOME环境变量

我们可以看到当用户是root用户,HOME变量就是root的家目录,是普通用户,HOME变量就是普通用户的家目录,也就是说HOME变量存放的是当前用户的家目录。
其实就是因为有HOME变量才能迅速切换到当前用户的家目录。
SHELL环境变量

代表登陆时是用的哪个版本的bash。
USER环境变量
记录着是哪个谁登陆的。

HISTSIZE环境变量
我们知道我们可以查到我们输入的历史命令,但是只能查到最近的1000条,bash只会记录最近的1000条,因为默认情况下HISTSIZE设置成1000条。

存放着历史命令数量限制。