Mac和Ubuntu系统下.bash_profile和.bashrc文件
本文部分参考Josh Staiger文章。
前言
我平时使用Ubuntu或者Mac。当设置shell的PATH
或者其他环境变量时,你可以放在.bashrc
和.bash_profile
其中的任何一个文件里,如果文件不存在你还可以创建一个,但是两个文件的启动有何区别?
以Ubuntu为例.bash_profile
在login shell 启动时执行而.bashrc
在non-login shell 启动时执行。(Mac 情况不同,后文提到)
login shell 和 non-login shell
login shell
用户登录(输入用户名密码)时打开的shell,就叫做login shell。用户登录主要分三种:
命令行登录
依次寻找下面三个文件。
~/.bash_profile
~/.bash_login
~/.profile
需要注意的是,这三个文件只要有一个存在,就不再读入后面的文件了。
ssh登录
和命令行登录情况相同
图形界面登录
只加载 /etc/profile
和 ~/.profile
。也就是说,~/.bash_profile
不管有没有,都不会运行。
non-login shell
用户进入操作系统以后,常常会再手动开启一个shell。这个shell就叫做 non-login shell,意思是它不同于登录时出现的那个shell,不读取/etc/profile
和.profile
等配置文件。
non-login shell会读入用户自己的bash配置文件 ~/.bashrc
。大多数时候,我们对于bash的定制,都是写在这个文件里面的。
为什么需要两种不同文件
比如你想在登录时打印一些电脑诊断信息(内存使用,在线用户等等)。你只想在每次登录的时候看到,所以将相关代码写入.bash_profile
如果你写入.bashrc
则你每次打开terminal都会打印这些信息。
Mac例外
Mac的Terminal打开的每个新shell默认为login shell只加载.bash_profile
。而且,不管是ssh登录,还是在图形界面里启动shell窗口,都是如此。
建议
将下面的脚本加入.bash_profile
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
注:第二行开头的那个点,是source命令的简写形式,表示运行某个文件,写成source ~/.bashrc
也是可以的。[ -f ~/.bashrc ]
中括号内侧有空格。
这样执行.bash_profile
时也会执行.bashrc
。