我使用多种版本的 linux(CentOS、SuSe 和 Ubuntu),每次我需要弄乱 PATH 时,我都会遇到不知道默认定义的东西在哪里的问题。
据我所知~/.bashrc
,~/.bash_profile
并且/etc/profile
是等式的一部分。有谁知道这些文件的用途和区别?
我使用多种版本的 linux(CentOS、SuSe 和 Ubuntu),每次我需要弄乱 PATH 时,我都会遇到不知道默认定义的东西在哪里的问题。
据我所知~/.bashrc
,~/.bash_profile
并且/etc/profile
是等式的一部分。有谁知道这些文件的用途和区别?
对于 Bash,它们的工作方式如下。阅读相应的栏目。执行 A,然后是 B,然后是 C,等等。B1、B2、B3 表示它只执行找到的第一个文件。
+----------------+-----------+-----------+------+
| |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 | | |
+----------------+-----------+-----------+------+
更详细的是来自http://www.solipsys.co.uk/new/BashInitialisationFiles.html的优秀流程图:
/etc/profile
是登录 shell 的全局配置(交互与否),~/.bash_profile
是登录 shell 的每个用户配置,并且~/.bashrc
是交互式非登录 shell 的配置。
来自man bash
:
调用
[...]
当 bash 作为交互式登录 shell 或作为带有 --login 选项的非交互式 shell 调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的文件中读取并执行命令。当 shell 启动时,可以使用 --noprofile 选项来禁止这种行为。
[...]
当一个不是登录 shell 的交互式 shell 启动时,bash 会从 ~/.bashrc 读取并执行命令,如果该文件存在的话。这可以通过使用 --norc 选项来禁止。--rcfile 文件选项将强制 bash 从文件而不是 ~/.bashrc 读取和执行命令。
.bashrc
为特定用户定义 shell 环境。每次 bash 启动时它都会运行,无论它以何种模式运行,例如交互式 shell、从远程调用(例如ssh user@host cat /etc/hosts
,甚至仅仅是 shell 脚本)运行。
.bash_profile
是每个用户的登录配置文件。它在您登录时运行一次,并在用户与系统交互时执行用户需要的操作,例如当日消息或新消息列表。
/etc/profile 是系统范围的登录配置文件脚本。它也会在您登录时运行一次,但在特定用户之前为所有用户运行.bash_profile
对于像 PATH 变量这样的环境变量,.bashrc 或 /etc/bash.bashrc 是一个好地方,这样您就不必担心登录或非登录 shell。