# Linux files: the difference between profile, bashrc, and bash_profile


<!--more-->

## profile

### 作用

profile，路径：`/etc/profile`，用于设置系统级的环境变量和启动程序，在这个文件下配置会对**所有用户**生效。

当用户登录（login）时，文件会被执行，并从`/etc/profile.d`目录的配置文件中查找shell设置。

### 在profile中设置环境变量

一般**不建议**在`/etc/profile`文件中添加环境变量，因为在这个文件中添加的设置会对所有用户起作用。

当必须添加时，我们可以按以下方式添加：

如，添加一个 HOST 值为 **xx**`.cn`的环境变量：

```bash
export HOST=xx.cn
```

添加时，可以在行尾使用`;`号，也可以不使用。

一个变量名可以对应多个变量值，多个变量值需要使用`:`进行分隔。

添加环境变量后，需要重新登录才能生效，也可以使用 source 命令强制立即生效：

```bash
source /etc/profile
```

查看是否生效可以使用 echo 命令：

```bash
$ echo $HOST
xx.cn
```

## bashrc

bashrc 文件用于配置函数或别名。bashrc 文件有两种级别：

- 系统级
- 用户级

### 系统级

系统级的位于`/etc/bashrc`，对所有用户生效。

### 用户级

用户级的位于`~/.bashrc`，仅对当前用户生效。

bashrc 文件只会对指定的 shell 类型起作用，bashrc 只会被 bash shell 调用。

## bash_profile

`bash_profile`只对单一用户有效，文件存储位于`~/.bash_profile`，该文件是一个用户级的设置，可以理解为某一个用户的 profile 目录下。

这个文件同样也可以用于配置环境变量和启动程序，但只针对单个用户有效。

和 profile 文件类似，bash_profile 也会在用户登录（login）时生效，也可以用于设置环境变理。

但与 profile 不同，bash_profile 只会对当前用户生效。

## 差异总结

这三种文件类型的差异用一句话表述就是：

`/etc/profile`，`/etc/bashrc` 是系统全局环境变量设定；

`~/.profile`，`~/.bashrc`用户家目录下的私有环境变量设定。

当登入系统时候获得一个 shell 进程时，其读取环境设定如下：

![img](/images/2022-06-23-Linux文件profile,bashrc,bash_profile区别/1)

- 首先读入全局环境变量设定档`/etc/profile`，然后根据其内容读取额外的设定的文档，如`/etc/profile.d`和`/etc/inputrc`；
- 根据不同使用者帐号，于其家目录内读取`~/.bash_profile`；
- 读取失败则会读取`~/.bash_login`；
- 再次失败则读取`~/.profile`（这三个文档设定基本上无差别，仅读取上有优先关系）；
- 最后，根据用户帐号读取`~/.bashrc`。

至于`~/.profile`与`~/.bashrc`都具有个性化定制功能，但`~/.profile`可以设定本用户专有的路径、环境变量等，它只能登入的时候执行一次。

`~/.bashrc`也是某用户专有设定文档，可以设定路径、命令别名，每次 shell script 的执行都会使用它一次。
