配置过环境变量的童鞋肯定都过类似经历,尤其在Linux 和Mac中,配置完环境变量后,新配置的环境变量需要source以后才会起作用;过程中会用到export这个关键字,export到底什么意思,有什么作用?
1
系统启动的时候会默认加载一组shell变量。如果后续新增的变量(比如JAVA_HOME),就必须在引入进来,export就是起到引入的作用。
export完成后,还需要source加载进来才能生效。
为什么有的时候每次打开一个shell窗口就要source一次?
这个就跟export引入变量的作用域有关系。
2
首先看下 Linux中环境变量的启动过程
如下图:
在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
如何使常用的环境变量只配置一次就可以呢?
通过上图环境变量启动过程,可将变量在当前用户或所有用户的配置中进行修改即可。
4
除了export可以显示环境变量外,set和env也可以显示环境变量。
set 用来显示本地变量, 环境变量
env 用来显示环境变量
export 用来显示和设置环境变量
set 显示当前shell的变量(本地变量),包括当前用户的变量( 环境变量)
env 显示当前用户的变量 (环境变量)
export 显示当前导出成用户变量的shell变量 (环境变量)
设置全局环境变量的方法是:
- 先创建一个局部环境变量,然后export到全局中;
- 这个变量在子shell中是可见的;在子shell可以修改,并不影响父shell中该变量的值
- 子shell中无法使用export改变父shell中全局环境变量的值;
- 设定全局变量的进程及其子进程中 该变量都是可见的