source etc/profile重新ssh上去失效

本篇博客主要探讨了一下Linux配置环境变量执行顺序问题。

linux环境配置文件

linux环境变量配置的文件有一下几种

  • /etc/environment
  • /etc/profile
  • /etc/bashrc(在Ubuntu中文件名为bash.bashrc)
  • ~/.profile
  • ~/.bashrc

linux配置文件执行顺序

/etc/environment文件是整个系统的环境变量配置,最先执行的,之后是/etc/profile执行,/etc/profile脚本里面有一个逻辑是如果/etc/bashrc(Ubuntu是bash.bashrc)文件存在,则执行此文件。然后执行用户目录下的.profile文件,这个文件有一个逻辑是如果~/.bashrc存在,则执行此文件。

今天服务器配置java环境变量的时候,在/etc/environment执行完之后reboot之后java -version有用,退出shell之后重新登录无效,遂改在了/etc/profile文件中,然而依旧是重启第一次有效,退出shell之后重新登录依然无效。后查阅资料发现要在~/.bashrc文件下执行以下source /etc/profile才会生效,于我依然无效。

最后我纳闷了,按理说/etc/environment和/etc/profile文件应该配置之后启动就会生效的,为何我退出重新进入shell就无效了呢?而且我发现,我用shell登录到服务器的时候,/etc/profile文件和~/.bashrc的echo输出语句无效,并没有执行输出。
经过多方资料的查阅之后了解到一下两种模式:

  • su这种登录情况会执行/etc/profile文件和~/.profile文件
  • 直接通过终端ssh上去则只会执行/etc/bashrc和~/.bashrc文件
  • 我用的是zsh,所以ssh上去不执行~/.bashrc而是执行~/.zshrc

第二点和第三点其实算是一点,因为ssh上去的只会执行当然脚本当前使用的shell配置文件,因为我使用的是zsh,所以执行的是~/.zshrc而不是~/.bashrc。当然,这是我测试出来的,你要问我严谨不,那肯定不严谨。但是我在两个文件分别echo输出文字,只有~/.zshrc文件输出了,所以我就暂且这么猜了。

因此,环境变量我配置在/etc/profile文件下,只要在~/.zshrc(或者使用用bash的在~/.bashrc文件中)里面加一个判断就能解决ssh登录不加载/etc/profile的问题了

1
2
3
if [ -d /etc/profile ]; then
source /etc/profile
fi