解决每次打开 VSCode 终端都需要 source ~/.bashrc 文件的问题

1,451 阅读2分钟

最近在公司新配置的 MacBook 上使用 VSCode 的时候发现 ~/.bashrc 不能执行,我把 nvm 的配置都写在了其中,表现为每次打开 VSCode 的终端,运行 npm 命令,都提示找不到。

一番探索之后,解决办法是:修改 ~/.bash_profile 或者 ~/.profile,确保包含如下代码

# 检查文件中是否包含如下内容,没有就增加到文件末尾
if [ -f ~/.bashrc ]; then
    . ~/.bashrc                                    
fi 

问题原因在于,系统没有自动的执行 ~/.bashrc 这个文件,导致我们每次都需要 source 这个文件。这跟 macOS 系统启动时读取配置文件的顺序有关,Linux 和 macOS都具有共同的 Unix 传统,所以这方面是类似的。

刚登录 Linux 或 macOS 时,系统读取配置顺序如下

  1. 首先启动 /etc/profile 文件(不建议随意修改这个文件)
  2. 然后启动用户家目录下的 ~/.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,比如 bashshzsh 等,虽然存在很多不同的 shellbash 却是最常见或许也是最主流的。

一般会在 .bash_profile 文件中显式调用 .bashrc。Linux 启动 bash 时首先会去读取 ~/.bash_profile 文件,这样 ~/.bashrc 也就得到执行了

参考资料