如果想要清楚的了解环境变量,我觉得我们需要先大致搞清楚一个简单的事——什么是会话?
会话大致是什么?
在这里我们的目的是更好的理解环境变量,所以适当讲解一下会话即可。通常我们都是用xshell连接远程服务器,都会打开一个会话,我们这次xshell连接之后所运行的所有进程都在这次连接所打开的会话里。如下图所示
- 操作系统会为每个连接都创建一个会话,即使是来自同一个用户的每次连接。
- 操作系统会为每个会话创建一个伪终端,此时大家可以将自己眼前的xshell的页面看做这个伪终端,就仿佛就是远程服务器上的伪终端一样。而大家可以把伪终端当做真正的终端一样,之所以叫做伪终端,是因为毕竟是服务器虚拟出来的,不是真实的物理终端而已。
- 每个伪终端都会关联一个bash,当在伪终端中执行诸如“ls" "cd"等命令时,伪终端会把命令交给bash去执行
- 本次连接中启动运行的所有进程都是在其对应的会话中运行的
- 当xshell关闭连接,该会话中的所有进程(除了守护进程,初学者就当做所有进程即可)都会收到一个退出信号,进而所有进程都会退出,伪终端和bash也会推出,会话结束。
什么是环境变量?
大家需要对环境变量有个感性的认识。当我们在执行程序时,一般需要给出程序完整的路径名如“/home/tom/exe”;可是对于一些程序如“ls" "cd"等程序,我们却可以直接运行,而无需添加完整的路径名。这个过程中操作系统肯定使用了某种策略:当输入“ls"后,操作系统发现当前目录下没有这个程序,它会给"ls"程序添加正确的路径名,这个正确的路径名当然对应的就是“ls"真实所在的目录名。那么它如何添加的呢?操作系统中有一个文件,文件里面有一个变量,这个变量大概长这样:PATH="/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/heng/.local/bin:/home/heng/bin"
PATH是变量名,后面是冒号分割的变量值。
它是这样添加的:输入“ls"后,发现不在当前目录,于是它就去操作系统中找一个特定的文件,然后在文件查找PATH这个变量,然后拿着冒号分隔开的变量值一个一个去试,终于得到正确的”ls“路径名。”ls"运行成功。PATH就是环境变量,就是众多环境变量其中的一员,用于实现正确启动程序这个特定的用途。
环境变量可以在哪?
- 在系统级配置文件中
- 在用户级配置文件中
- 在当前会话临时文件中
这三个地方都什么意思:以PATH这个环境变量来举例,它可以在这三个地方中的任何一个地方;如果在系统级配置文件中,每个用户都可以看到,每个用户都可以使用;如果在用户级环境变量中,只有该用户可以看到,只有该用户可以使用;如果在当前会话临时文件中,只有此次会话可以看到,下次连接就看不到了。接下来,会详细给大家解释。
会话与环境变量加载
- 假设系统级配置文件的文件名叫做A。
- 假设tom这个用户的用户级配置文件叫做tomB,xu这个用户的用户级配置文件叫做xuB。
- 假设tom第一次会话的临时文件叫做tomC1,xu此次会话的临时文件叫做xuC1。
- 假设tom第二次会话的临时文件叫做tomC2。
xhsell进行连接时,会话第一步加载系统级配置文件,第二步加载用户级配置文件,而会话中的临时文件是会话中自己定义的环境变量,马上就说。所以在系统级配置文件中的环境变量每个用户都可以使用,而对于在用户级配置文件中的环境变量由于tom只能加载自己的用户级配置文件tomB,不能加载xu的用户级配置文件xuB,所以tom只能看到自己用户级配置文件中的环境变量,也就是说定义在用户级配置文件中的环境变量,只能被该用户看到。接下来,会实操给大家看。
如何创建、查看等操作环境变量?
如何查看环境变量?
echo $环境变量名--->用于查看指定的环境变量
用env命令查看当前用户全部的环境变量
如何创建环境变量?
export用于创建环境变量,接下来我们创建一个变量名为test_var,值为hello的环境变量
在终端命令行输入export test_var="hello"所创建的环境变量,处在当前会话临时文件中,只在当前会话可见。我们让tom创建这个环境变量,然后再打开一个会话,做个测试。
可以看到在第二个连接创建的会话中,无法查看其他会话中的环境变量。
将环境变量创建到配置文件中
前面讲到 “xhsell进行连接时,会话第一步加载系统级配置文件,第二步加载用户级配置文件” 。那么用于处理环境变量的系统级配置文件和用户级配置文件究竟是那个文件呢,或者说是那些文件呢?
- 用户级别环境变量定义文件:
~/.bashrc
、~/.profile
(部分系统为:~/.bash_profile
) - 系统级别环境变量定义文件:
/etc/bashrc
、/etc/profile
(部分系统为:/etc/bash_profile
)、/etc/environment
我们将test_var="hello"创建到用户级配置文件~/.bashrc中,然后
source ~/.bashrc加载使其生效,最后看看在第二个终端中能不能看到,按照我们之前所讲,用户级环境变量在这个用户所登录的任何一个会话中都是可以看到的。
在第一个会话中,在home/tom目录下使用:vim .bashrc(~/.bashrc和~/.profile都是环境变量的用户级配置文件,在任意一个文件中添加环境变量都可以,效果一样,后续系统级配置文件同理)
然后在第二个会话中使用source ~/.bashrc加载使其生效
确实正如我们所预料。
至于测试在环境变量的系统级配置文件中添加环境变量,然后会使所有用户都看到的测试实验,对于大家来说,已经是很简单了,不再赘述。
常见的环境变量都有哪些?
了解常见的环境变量都有哪些,有助于大家进一步感性认识环境变量。
- PATH:决定了 shell 将到哪些目录中寻找命令或程序
- HOME:当前用户主目录(就是用户登录linux系统中时,默认的目录
- USER:当前用户的用户名。
- HISTSIZE:历史记录数
- LOGNAME:当前用户的登录名
- HOSTNAME:指主机的名称
还有很多常见的环境变量,这里举出这几个是为了稍加讲解让大家进一步认识环境变量。
PATH这个环境变量肯定在系统级配置文件里,当然了也可以同时在用户级配置文件里,更可以同时在会话的临时文件里。那么假如系统级配置文件里test_val="111",用户级配置文件里test_val="222",而会话临时文件里test_val="333",当你执行echo $test_val时会输出什么呢?答案是:333。加载步骤为:系统级配置文件--->用户级配置文件--->会话临时文件,这个过程采用覆盖策略。
· HOME这个环境变量,逻辑上来讲是不是完全可以在用户级配置文件里呀。其实究竟在哪里并不重要,重要的是大家理解这个逻辑即可。
环境变量还有很多细节问题,如各个配置文件如何执行,如何在编写代码时获取使用环境变量。在大家总体上理解好环境变量的基础上,剩下的事已经很简单了,大家用到时查阅相关资料即可。