环境变量配置的几种方法

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
2.用 vim 打开这个文件编辑
sudo vim /etc/paths.d/mysql

原理:

其实在/etc/profile下会有一个path_helper的工具,这个工具就是会读取/etc/paths.d目录下的文件里面的路径,然后加载在环境变量$PTAH。

eval `/usr/libexec/path_helper -s`

/etc/paths.d/*参考资料

6、遇到的问题

在配置linux的时候,发现一个问题:su root切换到root用户后,/etc/profile 中配置的PATH不起效果。

/etc/profile 定义的PATH不是全局有效吗?

答案是使用:用su - root 代替 su root

概念:登录shell,交互shell

  1. 不同用户初始的PATH是不一样的。切换用户系统会先将PATH设为初始值,然后再根据调用的初始化脚本,添加PATH中的路径。并不是所有用户共用一个PATH
  2. su - root,产生一个登录shell去执行后面的指令。登录 shell 执行的是shell 登录的流程,会执行 /etc/profile,/etc/profile.d/下定义的.sh都会执行。*
  3. su root,产生一个非登录交互shell,非登录交互shell,只执行 用户家目录下 .profile等配置文件。

你可能感兴趣的:(linux)