本文已参与「新人创作礼」活动,一起开启掘金创作之路。
什么是环境变量
从我们学习Java开始,就经常接触一个东西——PATH,也叫环境变量。
环境变量是操作系统提供给应用程序访问的简单 key / value字符串;windows/linux/mac都有同样的概念。
环境变量的作用
当我们拥有一个可执行文件,并且想让它可以在任意目录下执行时,我们可以将该文件所在的目录添加进环境变量中。
举个例子——以Java为例
在没有配置Java环境变量的时候,我们在终端执行java -version命令会提示命令无法找到。
[root@centos ~]# java -version
-bash: java: command not found
SHELL
但是我们可以进入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)
SHELL
这是因为在该目录中的java是一个可执行文件。但是现在的问题是,我们只能够在该目录下达到该效果,如果我们想在其他目录下也可以执行该可执行文件,就需要将该可执行文件所在的目录添加进环境变量中。
可以通过编辑/etc/profile文件进行配置环境变量,在末尾添加:
export JAVA_HOME=/opt/module/jdk1.8.0_333
export PATH=$JAVA_HOME/bin:$PATH
SHELL
保存并退出,执行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.
SHELL
这段话的主要意思是,如果你对相关操作不够理解,就不要编辑此文件。
其原因之一就和环境变量PATH相关。
在一台新的CentOS7机器中输出PATH:
[root@daa9974571f6 /]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL
可以发现其中已经存在部分目录:
- /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,因为这样即便配失败了,也仅仅是对应用户的操作无法进行,不影响系统。