> For the complete documentation index, see [llms.txt](https://lizh.gitbook.io/knowledge/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lizh.gitbook.io/knowledge/tech/08-kan-dong-shen-me-shi-huan-jing-bian-liang.md).

# 看懂什么是环境变量

首次接触环境变量是很久以前了，当时，包括后面的一长段时间，都是临时在网页中搜索增加环境变量的方法，一直缺乏一个全面的了解。比如：环境变量到底是什么，有什么作用；环境变量有哪些；不同系统（Mac、Window）如何配置环境变量等。

## 什么是环境变量？

首先要明白一个概念，就是我们计算机中的操作系统，本质上就是一个巨大的程序。这个程序可能就是 Windows，Linux，Mac 系统中的一种，但是本质都是程序。其他应用程序（JDK、MySQL、Chrome、微信。。。），都在在操作系统内运行的。

环境变量是**操作系统中描述运行环境的变量，其本质是操作系统中一个具有特定名字的变量**。它包含了一个或者多个应用程序将使用到的信息，可以被操作系统使用，也可以被操作系统内的其他应用程序使用！

有些应用程序在安装完成后，还必需配置环境变量才能正常运行，如：JDK、MySQL等。

## 环境变量有哪些？

环境变量是一个总称，代表了**系统变量和用户变量**，一般我们说环境变量都是指这两种。系统变量就是系统级别的变量，可以被系统的所有用户使用。用户变量运行在系统变量之上的，每个用户可以拥有自己独立的变量，这些变量只允许自己使用，与其他用户的用户变量互不干扰。

### 环境变量的储存文件（Mac）

* 系统环境变量定义文件： `/etc/environment`、`/etc/profile|/etc/bash_profile`）、`/etc/bashrc`；
* 用户环境变量定义文件：`~/.bashrc`、`~/.profile|~/.bash_profile`；

系统环境变量不建议修改 `/etc/profile` ，因为它只在用户登录才会加载；一般在 `/etc/bashrc` 中添加，它会在每次 `bash shell` 执行时加载。

环境变量的加载顺序如下：

1. /etc/environment
2. /etc/profile
3. /etc/bashrc
4. /etc/profile.d/test.sh
5. \~/.profile
6. \~/.bashrc

### 环境变量的储存文件（Window）

## 为什么要配置环境变量？

当启动一个应用程序时，无论是点击程序的图标，还是在终端通过命令启动，都是系统先找到程序的安装目录，然后启动程序。

程序的图标包含了应用程序的安装位置信息，点击它们时，系统会按照位置信息找到安装目录，启动程序。而在终端启动时，系统通过以下三种方法定位程序的安装目录，其中，最后一种就跟环境变量有关了：

* 指定完整的程序文件路径：

  ```shell
  /usr/bin/java -version
  ```
* 定位到程序的安装目录（系统在当前目录搜索可执行程序）：

  ```shell
  cd /usr/bin
  java -version
  ```
* 系统根据程序名，自动搜索可执行的程序：

  ```shell
  java -version
  ```

在配置环境变量前，运行 `java -version` 是会报错的。因为操作系统并不知道你的 `java` 程序（文件）在哪里。

### PATH是干什么的？

**系统变量就是一个大的容器，其中里面有一个环境变量是PATH，PATH主要用于储存各种命令的路径。**

当要求系统运行一个程序而没有告诉它程序所在的完整路径时，**系统除了在当前目录下面寻找此程序外，还会到 PATH变量中指定的路径去找**。即，如果可执行程序不在当前目录下，操作系统会**自动依次搜索 PATH 变量**中所指定的所有目录。

当然，不在 PATH 中设置路径也可执行程序，但必须把完整的路径写出来，如：`/usr/bin/java -version`。

查看PATH有哪些路径：

```shell
echo $PATH
```

查找使用的指令是PATH的哪个路径：

```shell
where java
which java
```

设置PATH：

`/etc/paths` 是系统设置的环境变量，修改此文件就可以修改环境变了。但是不建议在此修改，因为这是系统预设的文件，最好不要动。

建议在 `/etc/paths.d/` 目录下添加新文件，如：`/etc/paths.d/mypath`。

或者使用命令行修改：

```shell
export PATH=/example/bin:$PATH  
# 在 Windows 系统中 PATH 变量中的所有路径采用分号分割，如果在 Linux 系统中采用冒号分割。
```

## 如何配置环境变量（Mac）？

### Mac系统

查看所有环境变量：

```shell
printenv
env
set #显示本地定义的shell变量，包括环境变量
```

查看单个环境变量，如：PATH：

```shell
printenv PATH
echo $PATH
echo ${PATH}
```

设置新的环境变量（临时）：

**临时环境变量**就是在当前窗口定义，且只能在当前窗口使用的变量。在新开一个窗口（或已开的另一个窗口），这个变量是不存在。

```shell
export MY_NEW_VAR="example"
echo $MY_NEW_VAR
```

设置新的环境变量（永久）：

**永久环境变量**会一直存在文件中，直到被手动删除。

```shell
#系统环境变量
vim /etc/profile # 写入  
export MY_NEW_VAR="example"
source /etc/profile #立即生效  

#用户环境变量
vim ~/.bash_profile
export MY_NEW_VAR="example"
source ~/.bash_profile #立即生效  
```

重新加载文件，让环境变量立即生效（在环境配置完毕后，一般是需要重新登录或重启SHELL才会生效）：

```shell
source ~/.bash_profile
```

删除环境变量：

```shell
unset MY_NEW_VAR
```

### Window系统

查看所有环境变量：

```shell
set
```

查看单个环境变量，如：PATH：

```shell
set PATH
```

修改环境变量：

```shell
set MY_NEW_VAR=example
set PATH=%PATH%;example
```

删除环境变量：

```shell
set PATH=
```
