Linux的PATH环境变量缓存问题
1.问题引入最近开始使用Hadoop3.0,由于电脑的硬盘空间不是很多了,就直接在原来的虚拟机上安装,原来的虚拟机上已经安装了Hadoop2.9,也配置好了环境变量,把原来的环境变量修改成现在的路径的时候就出现了如下问题。修改了HADOOP_HOME为/opt/hadoop-3.2.1,并且source了/etc/profile文件,但是在使用Hadoop命令的时候发现Hadoop命令还...
1.问题引入
最近开始使用Hadoop3.0,由于电脑的硬盘空间不是很多了,就直接在原来的虚拟机上安装,原来的虚拟机上已经
安装了Hadoop2.9,也配置好了环境变量,把原来的环境变量修改成现在的路径的时候就出现了如下问题。
修改了HADOOP_HOME为/opt/hadoop-3.2.1,并且source了/etc/profile文件,但是在使用Hadoop命令的时候发现Hadoop命令还是指向的原来的Hadoop2.9.0的目录,并且PATH变量中两个版本的HADOOP都存在。
此时想使用Hadoop3.0版本的命令就只能通过全路径使用
那么,为什么会出现这种问题呢?
2.Linux系统的hash命令
Linux系统下会有一个hash表,当你刚开机时这个hash表为空,每当你执行过一条命令时,hash表会记录下这条命令的路径,就相当于缓存一样。第一次执行命令shell解释器默认的会从PATH路径下寻找该命令的路径,当你第二次使用该命令时,shell解释器首先会查看hash表,没有该命令才会去PATH路径下寻找。
hash表的作用:大大提高命令的调用速率。
也是就是说,Linux会把之前使用过的命令记录在一个hash表中,方便快速找到命令,如果之前使用过一些命令,那么这些命令会在hash表中有缓存,正是这个缓存导致了环境变量配置时的问题,特别是在做相同的软件的升级的时候,会导致出现这个问题。
可以使用hash -l命令查看当前hash表中的命令缓存
之前版本的Hadoop命令在hash表中有缓存
3.解决方案
使用hash命令清空缓存?
hash 命令参数
-l 显示hash表内容
-r 清除hash表
-d openssl 删除表中某一条(删除openssl)
-t openssl 查看openssl命令路径(hash表中没有的话,可以调用which命令)
-p /usr/bin/openssl aliesopenssl 往hash表中添加一条,执行aliesopenssl即执行openssl命令(起别名)
可以使用hash -r 清除缓存,然后重新source环境变量,发现问题没有解决
反而PATH中的路径越来越多了,这是为什么呢?
其实根本原因不是hash的缓存导致的环境变量的问题,而是在Linux的Shell环境中,PATH作为一个变量是可以被不断的修改值的,而我配置环境变量的方式是在原有的环境变量的基础上追加,就会导致问题的发生,PATH变量会被越加越多。那怎么解决呢?
那就要回到source命令的作用上了,简单的的说,source命令的作用是在当前bash环境下读取并执行指定文件中的命令。通常用于重新执行刚修改的初始化文档,并且source执行后只会在当前的会话生效。第二次对/etc/profile文件进行source的时候,由于我们是使用的PATH=$PATH的方式进行对环境变量的追加,而上一次的PATH变量中已经包含了原来的一些配置就会导致出现两个Hadoop的路径都在PATH中。
说了这么多,如何解决呢?
其实比较简单,source命令只是在当前的会话中修改了使/etc/profile中的配置生效了,那我们可以通过exit或者Ctrl+D退出当前会话,然后重新连接到一个新的会话就可以了。
其实还有一种方法,就是重新指定PATH的值,而不引用之前PATH的值,也是可以解决的。
总结:Linux是一个多用户的操作系统,在用户登录的时候,会指定生成一个会话,我们在这个会话中可以设置很多临时的东西,但是一旦需要设置全局的环境变量或者在修改主机名的时候,就需要退出再重新登录一下,就会把之前的缓存清除掉。
更多推荐
所有评论(0)