最近在公司新配置的 MacBook 上使用 VSCode 的时候发现 ~/.bashrc 不能执行,我把 nvm 的配置都写在了其中,表现为每次打开 VSCode 的终端,运行 npm 命令,都提示找不到。
一番探索之后,解决办法是:修改 ~/.bash_profile 或者 ~/.profile,确保包含如下代码
# 检查文件中是否包含如下内容,没有就增加到文件末尾
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
问题原因在于,系统没有自动的执行 ~/.bashrc 这个文件,导致我们每次都需要 source 这个文件。这跟 macOS 系统启动时读取配置文件的顺序有关,Linux 和 macOS都具有共同的 Unix 传统,所以这方面是类似的。
刚登录 Linux 或 macOS 时,系统读取配置顺序如下
- 首先启动
/etc/profile文件(不建议随意修改这个文件) - 然后启动用户家目录下的
~/.bash_profile、~/.bash_login或~/.profile文件中的其中一个。具体执行的顺序为:~/.bash_profile、~/.bash_login、~/.profile。
看到了吧,其中并不包含 ~/.bashrc,那么解决的办法很简单,就是在上述的文件任意一个中,执行一次 ~/.bashrc 就好了,怎么执行见上面的代码片段。推荐是 ~/.profile,如果该文件不存在就创建它。
你还可以继续扩展,举例来说:
如果 ~/.bash_profile 文件存在的话,且在 ~/.bash_profile 文件中会有以下内容,会执行 ~/.bashrc 文件。
# .bash_profile
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
而如果 ~/.bashrc 中又有以下内容,则会执行 /etc/bashrc 文件。
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
最后的执行顺序则变为:
/etc/profile → (~/.bash_profile | ~/.bash_login | ~/.profile) → ~/.bashrc → /etc/bashrc
科普
shell是一个能解释你输入进终端程序的东西,并且基于你的输入来运行命令,而.bashrc它就相当于shell的配置文件。Linux 系统中有很多 shell,比如
bash、sh、zsh等,虽然存在很多不同的shell,bash却是最常见或许也是最主流的。一般会在
.bash_profile文件中显式调用.bashrc。Linux 启动 bash 时首先会去读取~/.bash_profile文件,这样~/.bashrc也就得到执行了