Mac OS 环境变量设置

问题:MacOS,配置了iTerms作为终端工具,最近发现在/etc/profile和~/.bashrc中配置的环境变量在开机或者打开新的终端的时候并没有自动加载,每一次打开新的终端端口都要重新source一下。但是诸如 echo $HADOOP_HOME 这样的命令执行是可以执行的,所以问题就在于环境变量总加载点在哪里。

Mac中的环境变量文件

Mac一般使用bash作为默认shell,mac系统的环境变量加载顺序一般为:

全局配置

  • /etc/profile 系统级别环境变量,全局公有配置,不管是哪个用户登录的时候都会读取该文件。此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置。
  • /etc/paths 全局环境变量建议修改到这个文件
  • /etc/bashrc 全局公有配置,bash shell执行时不管是何种方式都会读取此文件。为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。

单个用户配置

  • ~/.bash_profile 任意一个文件中添加环境变量(注意Linux中是.bashrc,Mac中是.bash_profile)。当bash shell是以login方式登录的时候才会读取此文件,该文件仅执行一次。如果在操作命令行的过程中想立刻生效,需要source命令。默认情况下,他设置一些环境变量,并加载用户的.bashrc文件
  • ~/.bashrc 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。

我的情况

  1. 首先发现/etc/profile中配置的环境变量名称是没有问题的,但是路径$PATH并没有加载

etc_profile环境变量检查

  1. 检查~/.bash_profile发现了罗列在这个文件中的环境变量都加载到了$PATH中,那么在这个文件中添加
    1
    2
    source /etc/profile
    source ~/.bashrc
    然后问题解决。

结论

注意我的~/.bash_profile中只有路径变量,并没有其他文件的加载。

/etc/profile中与其他路径的加载相关的也只有

1
2
3
4
5
6
7
if [ -x /usr/libexec/path_helper ]; then
eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
[ -r /etc/bashrc ] && . /etc/bashrc
fi

所以私以为~/.bash_profile会是最终配置$PATH的地方,至少是决定了最终环境路径的地方。