配置过环境变量的童鞋肯定都过类似经历,尤其在Linux 和Mac中,配置完环境变量后,新配置的环境变量需要source以后才会起作用;过程中会用到export这个关键字,export到底什么意思,有什么作用?

1

系统启动的时候会默认加载一组shell变量。如果后续新增的变量(比如JAVA_HOME),就必须在引入进来,export就是起到引入的作用。
export完成后,还需要source加载进来才能生效。

为什么有的时候每次打开一个shell窗口就要source一次?
这个就跟export引入变量的作用域有关系。

2

首先看下 Linux中环境变量的启动过程

如下图:

es_heap_size 环境变量_es_heap_size 环境变量


在shell中执行程序,shell会提供一组环境变量。当打开一个shell命令窗口的时候,就代表一个shell环境加载完成。

  • export用来设置或显示环境变量;
  • export可新增、修改或删除环境变量;
  • export的作用范围仅限于此次建立的连接登录操作;
    export语法:
export [-fnp] [变量名称key] = [变量值value]
#参数说明
-f:代表[变量名称]中为函数名称
-n:删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中
-p:列出所有的shell赋予程序的环境变量

3

shell中变量环境分三种:内部变量、环境变量、用户变量

内部变量:系统提供,不用定义,不可修改;
环境变量:系统提供,不用定义,可以修改,利用export将用户变量转为环境变量;
用户变量:用户定义,可以修改;
内部变量值是不可修改的,如下:

表示方法     描述
   $n     $1 表示第一个参数,$2 表示第二个参数 ...
   $#     命令行参数的个数
   $0     当前程序的名称
   $?     前一个命令或函数的返回码
   $*     以"参数1 参数2 ... " 形式保存所有参数
   $@     以"参数1" "参数2" ... 形式保存所有参数
   $$     本程序的(进程ID号)PID

如何使常用的环境变量只配置一次就可以呢?
通过上图环境变量启动过程,可将变量在当前用户或所有用户的配置中进行修改即可。

es_heap_size 环境变量_环境变量_02

4

除了export可以显示环境变量外,set和env也可以显示环境变量。

set 用来显示本地变量, 环境变量
env 用来显示环境变量
export 用来显示和设置环境变量

set 显示当前shell的变量(本地变量),包括当前用户的变量( 环境变量)
env 显示当前用户的变量 (环境变量)
export 显示当前导出成用户变量的shell变量 (环境变量)

设置全局环境变量的方法是:

  • 先创建一个局部环境变量,然后export到全局中;
  • 这个变量在子shell中是可见的;在子shell可以修改,并不影响父shell中该变量的值
  • 子shell中无法使用export改变父shell中全局环境变量的值;
  • 设定全局变量的进程及其子进程中 该变量都是可见的