# 环境变量

## 环境变量的作用

Linux环境变量是一种在操作系统中定义的变量，它们包含了一些操作系统或应用程序的设置信息，可以在程序运行时动态地改变。环境变量的作用如下：

1. 程序的执行路径：环境变量PATH定义了操作系统在哪些目录中查找可执行文件。通过将可执行文件所在的目录添加到PATH中，可以使程序在任何位置运行。
2. 配置文件的路径：环境变量HOME指定了用户主目录的路径，一些应用程序会在这个目录中查找配置文件。
3. 资源限制：环境变量ULIMIT可以控制操作系统对进程的资源使用限制，例如内存、CPU时间等。
4. 应用程序的配置：一些应用程序会使用环境变量来配置其行为，例如JAVA_HOME用于指定Java安装的位置。
5. 程序运行时的临时设置：有些程序在运行时需要根据不同的环境进行不同的配置，例如GOPATH用于指定Go编译器的工作路径。

总之，环境变量在Linux系统中扮演着非常重要的角色，它们可以方便地配置操作系统和应用程序的行为，提高系统的可维护性和可定制性。

## 环境变量的查看

在Linux中，可以使用以下命令来查看当前的环境变量：

- `printenv`命令

  使用`printenv`命令可以显示当前所有的环境变量及其对应的值。例如，执行以下命令可以查看当前所有的环境变量：

  ```Shell
  printenv
  ```

- `env`命令

  env命令也可以用来查看当前所有的环境变量及其对应的值。例如，执行以下命令可以查看当前所有的环境变量：

  ```Shell
  env
  ```

- `echo $变量名`命令

  使用`echo $变量名`命令可以查看指定环境变量的值。例如，执行以下命令可以查看PATH环境变量的值：

  ```Shell
  echo $PATH
  ```

  在上述命令中，$符号用于获取变量的值。

- `set`命令

  `set`命令可以显示当前所有的环境变量和用户定义的shell变量。执行以下命令可以查看当前所有的变量：

  ```Shell
  set
  ```

这些命令可以帮助你查看当前的环境变量，并根据需要进行相应的配置和修改。

## 环境变量的配置

Linux中环境变量的配置通常有两种方式：临时设置和永久设置。下面是它们的具体配置方法：

### 临时设置环境变量

可以通过以下命令在当前终端中临时设置环境变量：

```Shell
export 变量名=变量值
```

例如，要在当前终端中设置GOPATH变量，可以执行以下命令：

```Shell
export GOPATH=/path/to/your/gopath
```

### 永久设置环境变量

- 修改shell配置文件（影响范围：当前用户）
  ::: tip 提示
  如果你使用的Shell不是bash，那么你需要编辑相应的配置文件，例如，如果你使用的是zsh，那么你需要编辑`~/.zshrc`文件。
  :::

  要永久设置环境变量，需要编辑用户主目录下的`.bashrc`或`.bash_profile`文件。

  `.bashrc`文件包含了Bash shell运行时需要加载的命令，比如命令别名、环境变量设置、设置PS1提示符等。每次新打开一个终端窗口，`.bashrc`文件都会被读取并执行其中的命令。

  `.bash_profile`文件在用户登录时被读取，它一般包含用户登录时需要执行的命令，比如设置PATH环境变量、定义shell函数等。`.bash_profile`只会在用户登录时被读取一次，所以如果需要立即生效，则需要手动执行`source .bash_profile`或者重新登录。

  编辑.bashrc文件：

  ```Shell
  vim ~/.bashrc
  ```

  在文件末尾添加以下内容，其中变量名为你要设置的环境变量的名称，变量值为你要设置的环境变量的值：

  ```Shell
  export 变量名=变量值
  ```

  保存并退出文件后，执行以下命令使配置生效：

  ```Shell
  source ~/.bashrc
  ```

- 修改desktop文件（影响范围：使用desktop文件启动的应用程序）
  你可以通过修改`/usr/share/applications`目录下的desktop文件来永久设置环境变量，具体参照[XDG桌面文件规范](https://wiki.deepin.org/zh/desktop%E6%96%87%E4%BB%B6%E8%A7%84%E8%8C%83)。

- 修改图形环境配置文件 （影响范围：图形会话）
  你可以通过修改图形环境的配置文件来永久设置环境变量，比如deepin使用的x11环境你可以更改`/etc/X11/Xsession.d/00deepin`文件来实现配置
  ::: danger 注意
  请谨慎修改图形环境的配置文件，因为它们会影响到整个图形会话。除非你知道你在做什么，否则不要修改这些文件。
  :::

- Systemd 环境变量配置文件（影响范围：所有用户或者某个用户）
  systemd 用户实例不会继承类似 `.bashrc` 中定义的 环境变量。systemd 用户实例有三种设置环境变量的方式：

  - 对于有 $HOME 目录的用户，可以在 ~/.config/environment.d/ 目录中新建一个".conf"文件，然后在其中写入格式为NAME=VAL这样的行。这些设置只对指定用户的用户单元有效 。更多信息可以参考 environment.d(5) 。
  - 使用 `/etc/systemd/user.conf` 文件中的 DefaultEnvironment 选项。这个配置在所有的用户单元中可见。
  - 在 `/etc/systemd/system/user@.service.d/` 下增加配置文件设置。 这个配置在所有的用户单元中可见。
  - 在任何时候， 使用 `systemctl --user set-environment` 或 `systemctl --user import-environment`. 对设置环境变量之后启动的所有用户单元有效，但已经启动的用户单元不会生效。
  - 使用由 dbus提供的 `dbus-update-activation-environment --systemd --all` 命令。和`systemctl --user import-environment`有同样的效果，但是会影响D-Bus会话。你可以把这个添加到shell初始化文件的末尾。
  - 对于用户环境的“全局”环境变量，可以使用会被某些生成器解析的`environment.d`目录。 更多信息可以参考environment.d(5)和 systemd.generator(7)。
  - 您还可以编写一个`systemd.environment-generator(7)` 脚本，该脚本可以生成因用户而异的环境变量，如果您需要分别给每个用户环境配置变量，这可能是最好的方法（ XDG_RUNTIME_DIR, DBUS_SESSION_BUS_ADDRESS等就是这种情况 ）。
  ::: tip 提示
      如果想一次设置多个环境变量，可以写一个配置文件，文件里面每一行定义一个环境变量，用 "key=value" 的键值对表示，然后在你的启动脚本里添加xargs systemctl --user set-environment < /path/to/file.conf。
  :::
  一般情况下，你需要设置 PATH 这个环境变量。 配置完成后，可以使用命令 systemctl --user show-environment 来验证值是否正确。

## 环境变量的配置文件

Linux系统中环境变量相关的配置文件主要有三个，分别是`/etc/profile`、`/etc/bash.bashrc`和`~/.bashrc`，这三个文件的作用分别是：

- `/etc/profile`：该文件为系统的每个用户设置环境信息，当用户第一次登录时，该文件被执行，并从 `/etc/profile.d/` 目录的配置文件中搜集 shell 的设置。
- `/etc/bash.bashrc`：该文件为每个运行 bash shell 的用户执行此文件，当 bash shell 被打开时，该文件被读取。
- `~/.bashrc`：该文件仅仅针对登录当前系统的用户执行，当用户登录时，该文件仅仅执行一次。因此，如果需要让修改立即生效，需要重新登录或者执行 `source ~/.bashrc` 命令。

如果你安装了其他软件，可能会在`/etc/profile.d/`目录下创建新的配置文件，这些文件会在`/etc/profile`文件中被引用，因此，如果你想让这些软件的环境变量生效，需要重新登录系统。

还有上文提到的Systemd环境变量配置文件，以及图形环境配置文件，这些配置文件的作用范围也不同，具体参照上文。

## 环境变量的删除

要删除环境变量，可以使用`unset`命令。例如，要删除GOPATH环境变量，可以执行以下命令：

```Shell
unset GOPATH
```

## 注意事项

::: warning 注意
在Bash中，环境变量的名称是区分大小写的，因此，如果你设置了GOPATH环境变量，那么你需要使用`echo $GOPATH`命令来查看GOPATH环境变量的值，而不能使用`echo $gopath`命令。而zsh不区分大小写，至于其他Shell参照其官方文档。
:::

::: warning 注意
在Linux中，环境变量的名称不能包含空格，因此，如果你设置了GOPATH环境变量，那么你不能使用`export GOPATH=/path/to/your gopath`命令来设置GOPATH环境变量，而应该使用`export GOPATH=/path/to/your/gopath`命令来设置GOPATH环境变量。
:::

::: warning 注意
在Linux中，环境变量的名称不能包含等号，因此，如果你设置了GOPATH环境变量，那么你不能使用`export GOPATH=/path/to/your=gopath`命令来设置GOPATH环境变量，而应该使用`export GOPATH=/path/to/your/gopath`命令来设置GOPATH环境变量。
:::

::: danger 警告
不要随意修改系统的环境变量，因为这可能会导致系统无法正常启动。不要随意修改`.profile`文件，无论其是系统级还是用户级的，均可导致session无法启动。
如果你了解相关知识并且执意修改，请先备份相关文件，并且创建一个新的管理员用户，以便在修改后无法启动时可以使用新的管理员用户恢复系统。（或者准备好liveCD以便于修复系统
:::

## 参考文献

archlinux wiki: [Environment variables](https://wiki.archlinuxcn.org/wiki/%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F)
