什么是环境变量
从我们学习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
一些常用的命令存在于这些目录中,如ls
、cat
等。
设想一下,如果我们将该文件破坏了,连这些最基本的命令都无法执行了,那么我们如何使用该系统?
这也是为什么在配置环境变量的时候,总会在赋值号后面存在一个:$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/profile
、source ~/.bash_profile
。
设置临时变量的方法为在终端执行export PATH=$PATH:[other path]
,设置后立即生效,但仅对当前终端有效,重新登录或重新启动系统后该变量失效。
基于此,建议对环境变量配置不够清楚的同学,当需要配置环境变量时,可以配置
~/.bash_profile
,因为这样即便配失败了,也仅仅是对应用户的操作无法进行,不影响系统。