CentOS7管理环境变量

设置环境变量

以安装软件SoftA为例,路径为/usr/local/SoftA/bin/softa。

临时生效

export PATH=$PATH:/usr/local/SoftA/bin

针对当前用户(永久生效)

# vim ~/.bash_profile
vim ~/.bashrc
    # 修改文件中PATH 一行,PATH=$PATH:$HOME/bin之后添加 (注意以冒号分隔)
    # 修改完之后如下:
    PATH=$PATH:$HOME/bin:/usr/local/SoftA/bin
    export PATH
# source ~/.bash_profile
source ~/.bashrc

针对所有用户(永久生效)

# vim /etc/profile
vim /etc/bashrc
    # 文件末尾追加
    PATH=$PATH:/usr/local/SoftA/bin
    export PATH
# source /etc/profile
source /etc/bashrc

推荐使用/etc/profile.d

/etc/profile/etc/profile.d的区别:两个都是设置环境变量的,/etc/profile.d//etc/profile好维护,不想要什么变量直接删除/etc/profile.d/下对应的shell脚本即可,不用像/etc/profile需要改动此文件。

vim /etc/profile.d/softa.sh
    # 设置SoftA的环境变量
    SOFTA_HOME=/usr/local/SoftA
    PATH=$SOFTA_HOME/bin:$PATH
    export SOFTA_HOME PATH
chmod 755 /etc/profile.d/softa.sh
/etc/profile.d/softa.sh
echo $SOFTA_HOME

.bash_profile和.bashrc

“profile”系列文件的主要目的在于为“登录shell”设置环境变量和启动程序;而“rc”系列文件的主要目的在于设置功能和别名
crontab里面执行一个命令,.bashrc设置的环境变量会生效,而.bash_profile不会

/etc/profile

此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置
推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,缺点是可能会给系统带来安全性问题。 这里是针对所有的用户的,所有的shell
需要注意的是

  1. 在/etc/profile里设置系统环境变量时,路径末尾不能以"/"结尾,否则将导致整个PATH变量出错
  2. 配置好环境变量后,要记得export输出这个变量,否则如下source后无效

/etc/bashrc(推荐)

为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取

~/.bash_profile

每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次,默认情况下,他设置一些环境变量,执行用户的.bashrc文件
交互式、login方式进入bash运行的,通常会调用~/.bashrc

~/.bashrc(推荐)

该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取
~/.bashrc是交互式、non-login方式进入bash运行的,所以一般优先把变量设置在.bashrc里面,比如在crontab里面执行一个命令,.bashrc设置的环境变量会生效,而.bash_profile不会
修改.bashrc文件,这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,这里是针对某一个特定的用户,如果需要给某个用户权限,使用这些环境变量,只需要修改其个人用户主目录下的.bashrc文件就可以了。

~/.bash_logout

当每次**退出系统(退出bash shell)**时,执行该文件

通过名字的不同,我们可以直观地将startup文件分为“profile”与“rc”两个系列,其实他们的功能都很类似,但是使用的场景不同,这也是最容易忽略的地方。
所谓的不同场景,其实就是shell的运行模式。运行中的bash有“交互”和“登陆”两种属性,而执行“profile”系列还是“rc”系列,就与shell的这两个属性有关。
原理上讲,“登陆shell”启动时会加载“profile”系列的startup文件,而“交互式非登陆shell”启动时会加载“rc”系列的startup文件。

启动文件的加载顺序

启动文件的加载顺序

交互式的登陆shell

登陆过程

  1. 读取并执行/etc/profile文件
  2. 读取并执行~/.bash_profile文件
  • 若文件不存在,则读取并执行~/.bash_login文件
  • 若文件不存在,则读取并执行~/.profile文件

登出过程

  1. 读取并执行~/.bash_logout文件
  2. 读取并执行/etc/bash.bash_logout文件

非交互式登陆shell

登陆过程

  1. 读取并执行/etc/profile文件
  2. 读取并执行~/.bash_profile文件
  • 若文件不存在,则读取并执行~/.bash_login文件
  • 若文件不存在,则读取并执行~/.profile文件

其他情况

  1. 图形模式登录时,顺序读取:/etc/profile和~/.profile
  2. 图形模式登录后,打开终端时,顺序读取:/etc/bash.bashrc和~/.bashrc
  3. 文本模式登录时,顺序读取:/etc/bash.bashrc,/etc/profile和~/.bash_profile
  4. 从其它用户su到该用户,则分两种情况:
    1. 如果带-l参数(或-参数,–login参数),如:su -l username,则bash是lonin的,它将顺序读取以下配置文件:/etc/bash.bashrc,/etc/profile和~ /.bash_profile。
    2. 如果没有带-l参数,则bash是non-login的,它将顺序读取:/etc/bash.bashrc和~/.bashrc
  5. 注销时,或退出su登录的用户,如果是longin方式,那么bash会读取:~/.bash_logout
  6. 执行自定义的shell文件时,若使用“bash -l a.sh”的方式,则bash会读取行:/etc/profile和~/.bash_profile,若使用其它方式,如:bash a.sh, ./a.sh,sh a.sh(这个不属于bash shell),则不会读取上面的任何文件。

总结

总结
上图解释:

  1. “直接执行”表示此文件被系统直接调用,它的执行是无条件的;
  2. “条件执行”表示此文件被系统调用是有先决条件的(没有优先级更高的文件可用);
  3. “引用执行”表示此文件不是被系统直接调用的,而是被其他文件显式调用的;
  4. 后面的数字表示文件被调用的顺序,数字越大调用越靠后;
  5. “非交互非登陆”shell的配置文件可以由BASH_ENV环境变量指定;