目录
什么是环境变量
全局环境变量
局部环境变量
用户定义变量
设置全局环境变量
/etc/profile
$HOME/.bash_profile
什么是环境变量
bash shell用一个叫做 环境变量(environment variable) 的特性来存储有关shell会话和工作环境的信息。即允许在内存中存储数据,使得在程序或shell中运行的脚本能够访问它们。
在bash shell中,环境变量分为两类:
- 全局变量
- 局部变量
全局环境变量
全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见。
查看全局变量,可以使用env
或printenv
命令。
使用环境变量,通过 $
+变量名。
系统环境变量基本上都是使用大写字母,以区别于普通用户的环境变量。
局部环境变量
顾名思义,局部环境变量只能在定义它们的进程中可见。set
命令会显示某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。
用户定义变量
一旦启动了bash shell,就能创建在这个shell进程内可见的局部变量。该进程创建的子shell无法读取父shell的局部变量。
用户可以通过export
变量,使变量变为全局变量,这样子shell也可以读取到。而子shell修改该变量,父shell中不受影响。
如果在子shell中设置环境变量,想要在父shell中读取呢?
一个使用场景是:多个执行脚本依赖于共同的环境配置,这个配置写在一个env.sh脚本里,如何使其他执行脚本可以读取到env.sh里变量?在子shell中export变量,并不能影响到父shell。
source命令(从 C Shell 而来)是bash shell的内置命令。点命令,就是一个点符号,(从Bourne Shell而来)是source的另一名称。这两个命令都以一个脚本为参数,该脚本将作为当前shell的环境执行,即不会启动一个新的子进程。所有在脚本中设置的变量将成为当前Shell的一部分。
[root@Lime-CentOS profile.d]# source ./java_home.sh
[root@Lime-CentOS profile.d]# . ./java_home.sh
如果想要删除环境变量
unset var_name
设置全局环境变量
上文中,可以知道,如果想要在本进程和子进程中使用共同的环境变量。通过source
命令去读取同一个环境变量脚本可以实现。这是用户自定义的方案。但很多时候,我们需要读取的全局环境变量并不知道source,所以需要一个默认的环境变量读取文件。
当你登录Linux系统时,bash shell会作为登录shell启动。登录shell会从5个不同的启动文件里读取
- /etc/profile
- $HOME/.bash_profile
- $HOME/.bashrc
- $HOME/.bash_login
- $HOME/.profile
/etc/profile
/etc/profile
文件是bash shell默认的主启动文件。只要你登录了Linux系统,bash就会执行/etc/profile启动文件的命令。
该文件会读取/etc/profile.d/
下所有的*.sh
文件,通过点命令(source)来加载变量。即在/etc/profile和/etc/profile.d/*.sh定义的变量,都是全局的系统环境变量。
$HOME/.bash_profile
$HOME下的启动文件都是用户专属的启动文件,定义该用户的环境变量。而/etc/profile则是系统的,所有用户的环境变量。
shell会按照下列顺序,运行第一个找到的文件,余下被忽略:
- $HOME/.bash_profile
- $HOME/.bash_login
- $HOME/.profile
.bashrc通过.bash_profile来调用。
总结:
将要设置的系统全局环境变量,比如JAVA_HOME,放在/etc/profile.d/目录下, 以*.sh脚本的形式定义。