1、Linux下大家熟悉的环境变量配置方式
/etc/profile
/etc/environment
/etc/bashrc
~/.bash_profile
~/.bashrc
~/.bash_history
~/.bash_logout
2、关于环境变量的读取顺序
用户登录 >> 加载`~/.bash_profile` >> bash_profile中配置了首先是使`~/.bashrc`生效
3、分别说明下
/etc/profile
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置./etc/environment
/etc/environment是设置整个系统的环境,而/etc/profile是设置所有用户的环境,前者与登录用户无关,后者与登录用户有关./etc/bashrc
为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.~/.bash_profile
~/.bashrc
生效范围登陆用户,功能同上面.~/.bash_logout
当每次退出系统(退出bash shell)时,执行该文件.
如果同一个变量在用户环境(/etc/profile)和系统环境(/etc/environment)有不同的值那应该是以用户环境为准了。
4、推荐的另外一种配置方式
因为/etc/profile
会读取 /etc/profile.d
目录下的sh脚本,因此可以在该目录下创建一个sh脚本配置环境变量,这样就可以不用修改系统原有的配置,增加新的环境变量配置,以下是我用java举例说明
cd /etc/profile.d
vim jdk-path.sh
(文件名称随意哈,自己感觉好就行)
export JAVA_HOME=/usr/local/jdk8
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile
经过以上步骤就可以配置java的环境变量了,这样是不是还不错…
对于Mac电脑其实还有一种配置的方式
5、Mac下的paths.d目录神奇用法
这个paths.d的作用很简单,就是在里面创建一个文件,然后写上需要在全局命令行下用到的命令,直接配置一个目录即可。
比如我有个应用MySQL需要在全局下使用,在Mac下可以升级为这样的做法:
1.创建一个文件
sudo touch /etc/paths.d/mysql
内容是命令的路径:/usr/local/mysql/bin
2.用 vim 打开这个文件编辑
sudo vim /etc/paths.d/mysql
原理:
其实在/etc/profile下会有一个path_helper的工具,这个工具就是会读取/etc/paths.d目录下的文件里面的路径,然后加载在环境变量$PTAH。
eval `/usr/libexec/path_helper -s`
6、遇到的问题
在配置linux的时候,发现一个问题:su root切换到root用户后,/etc/profile 中配置的PATH不起效果。
/etc/profile
定义的PATH不是全局有效吗?
答案是使用:用su - root 代替 su root
概念:登录shell,交互shell
- 不同用户初始的PATH是不一样的。切换用户系统会先将PATH设为初始值,然后再根据调用的初始化脚本,添加PATH中的路径。并不是所有用户共用一个PATH。
- su - root,产生一个登录shell去执行后面的指令。登录 shell 执行的是shell 登录的流程,会执行 /etc/profile,/etc/profile.d/下定义的.sh都会执行。*
- su root,产生一个非登录交互shell,非登录交互shell,只执行 用户家目录下 .profile等配置文件。