什么是环境变量

从我们学习Java开始,就经常接触一个东西——PATH,也叫环境变量。
环境变量是操作系统提供给应用程序访问的简单 key / value字符串;windows/linux/mac都有同样的概念。

环境变量的作用

当我们拥有一个可执行文件,并且想让它可以在任意目录下执行时,我们可以将该文件所在的目录添加进环境变量中。

举个例子——以Java为例

在没有配置Java环境变量的时候,我们在终端执行java -version命令会提示命令无法找到。

[root@centos ~]# java -version
-bash: java: command not found

但是我们可以进入jdk中的bin目录,执行./java -version命令:

[root@centos bin]# pwd
/opt/module/jdk1.8.0_333/bin
[root@centos bin]# ./java -version
java version "1.8.0_333"
Java(TM) SE Runtime Environment (build 1.8.0_333-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.333-b02, mixed mode)

这是因为在该目录中的java是一个可执行文件。但是现在的问题是,我们只能够在该目录下达到该效果,如果我们想在其他目录下也可以执行该可执行文件,就需要将该可执行文件所在的目录添加进环境变量中。

可以通过编辑/etc/profile文件进行配置环境变量,在末尾添加:

export JAVA_HOME=/opt/module/jdk1.8.0_333
export PATH=$JAVA_HOME/bin:$PATH

保存并退出,执行source /etc/profile命令重新加载该文件,即可达到在任意位置执行java可执行文件的效果。

其中,这两句话的含义是:

  • 暴露jdk的根目录,即JAVA_HOME。因为有些程序或环境需要依赖于java环境,如hadoop,它们会通过从系统中获取JAVA_HOME的方式寻找jdk的根目录。
  • PATH赋值为$JAVA_HOME/bin:$PATH($的作用是取值,可以获取已经定义的变量的值;:是类Unix系统中多个文件夹的分隔符),将$JAVA_HOME/bin添加进PATH中(注意:最后的:$PATH不能省略,否则PATH中就只存在$JAVA_HOME/bin了,这种情况下系统是无法使用的!)。

危险事项!!!

查看/etc/profile文件,在开头有如下注释:

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

这段话的主要意思是,如果你对相关操作不够理解,就不要编辑此文件。
其原因之一就和环境变量PATH相关。

在一台新的CentOS7机器中输出PATH

[root@daa9974571f6 /]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

可以发现其中已经存在部分目录:

  • /usr/local/sbin
  • /usr/local/bin
  • /usr/sbin
  • /usr/bin
  • /sbin
  • /bin

一些常用的命令存在于这些目录中,如lscat等。
设想一下,如果我们将该文件破坏了,连这些最基本的命令都无法执行了,那么我们如何使用该系统?

这也是为什么在配置环境变量的时候,总会在赋值号后面存在一个:$PATH,因为这可以将原有的环境变量保存。
如果不加这项,PATH中将不再存在/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin,也就是那些最基本的命令,我们无法执行。

环境变量生效范围

修改环境变量有三种方式,分别为修改/etc/profile、修改~/.bash_profile、设置临时变量。

/etc/profile~/.bash_profile的修改都是永久的,前者是系统级别的,对所有用户生效,后者是仅对对应的用户生效。

在系统启动时或用户登录时,其加载顺序为:先加载/etc/profile,再加载~/.bash_profile
如果我们修改了内容并且想要立即生效,只需要在修改后执行source命令,如source /etc/profilesource ~/.bash_profile

设置临时变量的方法为在终端执行export PATH=$PATH:[other path],设置后立即生效,但仅对当前终端有效,重新登录或重新启动系统后该变量失效。

基于此,建议对环境变量配置不够清楚的同学,当需要配置环境变量时,可以配置~/.bash_profile,因为这样即便配失败了,也仅仅是对应用户的操作无法进行,不影响系统。