如果你搞不清.bashrc.bash_profile.bash_login.profile几个文件的区别,这篇文章就是来拯救你的。

TL;DR

  • ~/.bash_profile 应该非常简单,只是按顺序读取 .profile.bashrc
  • ~/.profile 包含不止 Bash 能用的东西,比如环境变量。
  • ~/.bashrc 包含所有你想要在交互式命令行中想要用的东西,比如EDITOR变量啊,各种自己习惯使用的命令别名之类的

还有几个要注意的事情:

  • 所有图像界面程序和 shell 都能用到的东西必须要放到 ~/.profile
  • ~/.bashrc 不要输出任何东西(因为有系统的非交互 shell 也会导入~/.bashrc,这种情况下,.bash_rc 输出某些信息可能会干扰到非交互脚本的执行)
  • 保证 ~/.bash_login 文件不存在,因为 ~/.bash_login文件会导致 bash 在~/.bash_profile不存在时,不读取~/.profile。从而出现奇怪的问题。

正文

Unix 系统默认的 Bourne Shell,当它在Login Shell模式时,从~/.profile读取命令配置。如果不是Login Shell模式,就不会从~/.profile读取配置

Bash 当他在Login Shell模式时,从~/.bash_profile读取配置,如果该文件不存在1,他会尝试从~/.profile文件读取配置。如果不是Login Shell模式,它会从读取~/.bashrc文件。

Bash 详细的载入顺序如下表:

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+

另外,Zsh 的载入顺序如下表:

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/zprofile   |    A      |           |      |
+----------------+-----------+-----------+------+
|~/.zprofile     |    B      |           |      |
+----------------+-----------+-----------+------+
|/etc/zshrc      |    C      |    A      |      |
+----------------+-----------+-----------+------+
|~/.zshrc        |    D      |    B      |      |
+----------------+-----------+-----------+------+
|/etc/zlogin     |    E      |           |      |
+----------------+-----------+-----------+------+
|~/.zlogin       |    F      |           |      |
+----------------+-----------+-----------+------+
|~/.zlogout      |    G      |           |      |
+----------------+-----------+-----------+------+
|/etc/zlogout    |    H      |           |      |
+----------------+-----------+-----------+------+
  1. 其实,当~/.bash_profile不存在时,还会尝试从~/.bash_login文件中读取,如果 .bash_login 文件再不存在,才是从~/.profile读取,不过.bash_login 通常都不会存在,也不建议使用.bash_login文件。