在 Unix* Like 环境下工作时,不免会遇到 bash 环境变量的配置。而每次面对 $HOME 目录下的一些 .bash* 文件时,总会暂时性的忘记该修改那个好。
实际中在那个文件中添加配置信息都没有问题,都可以正常工作。那为什么要设置两个配置文件呢?它们的区别是什么?
查找 bash 的帮助文档。可以找到下面的描述。
~/.bash_profile
The personal initialization file, executed for login shells
~/.bashrc
The individual per-interactive-shell startup file
.bash_profile 在登录 shell 时执行,而 .bashrc 会在不是以 login 方式打开 shell 时执行(比如执行 /bin/bash )。
login shell vs non-login shell
不论你是坐在电脑旁或者通过 ssh 远程登录主机,以用户名/密码登录终端时,.bash_profile 都会在初始化命令行提示符之前执行。
如果你已登录到机器上,并且在 Gnome 或 KDE 桌面下打开了一个新的终端(通常这种方式打开 xterm),那么 .bashrc 会在初始化命令行提示符之前执行。当然上面提到的,通过在终端执行 /bin/bash 开启一个新的 bash 示例时,同样也会调用 .bashrc 。
.bash_profile vs .bashrc
举例来说,如果你想在每次登录机器时,都在终端打印机器的诊断信息(当前用户,内存使用、负载均衡等),则需要将配置信息写入 .bash_profile。而如果你想在每次打开终端时进行提示,则记入 .bashrc 。
这样做的好处是针对某些应用场景,可以进行更精细的配置。
上面的描述并不适用于 Mac OS ,对于 Terminal.app ,每次运行时,都只执行 .bash_profile。
那到底写到哪个文件呢?
大多数情况下,你不想为 login shell 和 non-login shell 两种方式分别维护配置文件,因为实际上维护的这两个配置文件通常用完成相似的工作。比如设定 PATH 环境变量,希望在两种方式下都能正常执行,你可以在 .bash_profile 中执行 source .bashrc 命令,并将 PATH 变量设置信息存放到 .bashrc 中。
vim ~/.bash_profile if [ -f ~/.bashrc ]; then source ~/.bashrc fi
这种情况下,在 login 到机器时,.bashrc 文件也会被执行。
现在新版的 Linux 通常也都已经考虑到了这个问题,通常都会在 .bash_profile 中添加如下的代码:
[root@vsso ~]# cat .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH unset USERNAME
所以一般性的共通内容,都可以写入到 .bashrc 文件中。