对linux系统中的/etc/profile进行多次source之后,打印PATH的值会出现重复

在安装大数据环境的时候,我们难免需要改动/etc/profile文件,将XX_HOME添加到PATH路径下,供用户在任意路径下,都可以直接输入命令来启动进程,如spark-submit。

但是,在改动了配置文件,并对配置文件进行source,使得配置文件中的变量在不用退出并重新登录的情况下直接生效。如果处理不当的花,这个时候就会出现问题了。

开始,我们只是想在/etc/profile里面将JAVA_HOME/bin添加到PATH中,保存退出之后,source一下配置文件,使得我们做的修改能够立即生效。如下图:

从上面最后一张图,我们可以清楚的看见已经成功的将JAVA_HOME/bin添加到了PATH路径下。这个时候,突然发现,还需要配置HADOOP_HOME/bin到PATH路径下。于是,我们在当前界面继续打开了/etc/profile文件,并做了相应的修改,如下图:

这个时候,我们source一下使得配置文件中的变量立马生效,并打印处PATH。

我们仔细观察可以看到PATH中的/opt/java/bin却出现了两次。我们在source一下呢,看看PATH的值会发生什么改变呢?

没错,/opt/java/bin重复了三次,/opt/hadoop/bin重复了两次。

那么,这个是为什么呢?为什么会出现这种情况呢?

这个要从source这个命令开始说起:
source命令使当前shell环境读入路径为filepath的shell文件并依次执行文件中的所有语句,通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。例如,当我们修改了/etc/profile文件,并想让它立刻生效,而不用重新登录,就可以使用source命令,如source /etc/profile。下图是鸟哥私房菜中给出的:

从上面这段话我们可以知道,source对/etc/profile执行的话,是在当前这一个主shell环境下执行的。在这个主shell环境下,第一次执行source的时候,会立即生效PATH的赋值(这个时候PATH=A:B,为方便写我们将系统初始的环境变量记为A,我们后期添加的变量记为B,如/opt/java/bin这样的)。此时再去当前主shell环境下修改PATH的值,将C这个变量(如/opt/hadoop/bin)也添加到PATH路径下,保存退出。在同一个环境下,PATH的值是上次执行source命令后的值(PATH=A:B),这个时候再去source一下/etc/profile,系统会从上到下依次执行profile文件中的所有语句。当我们执行到

红框处的时候,这个PATH代表的是我们上次执行source命令后的值(PATH=A:B)。source执行完之后,PATH的值将会变成PATH=A:B:B:C。这样PATH中的值产生了重复。

那么,我们该如何解决这个问题呢?

很简单,我们只需要重新打开一个窗口就好了。

这个时候,我们很好奇为什么新开一个窗口就可以解决输出问题呢?因为source命令是在当前shell环境下执行的,生效的PATH值也是在当前shell中有效。当我们新开一个窗口的时候,之前生成的PATH也就失效了。这个新开的窗口环境下,使用echo $PATH时候,系统会自动从配置文件中按照文件中从上至下的顺序拼接处PATH值。

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值