今天在控制台中登入 Debian 后,发现 bash 并不会读取家目录下的 .bashrc 文件,于是开始 man bash。以关键字 .bashrc 进行查找得到如下信息:
A login shell is one whose first character of argument zero is a -, or
one started with the --login option
一个登录 shell 指的是实参 0 的第一个字符是‘-’或者以加入 --login 选项的 shell
从上面的信息中我了解到了 login shell 的定义。login shell 与 非 login shell 在登入、退出过程中的处理是不同的。
login shell
当 bash 作为 login shell 时首先读取并执行 /etc/profile 中的内容,然后依次读取并执行 ~/.bashrc_profile,~/.bash_login, ~/.profile 中的内容
当一个 login shell 退出时 bash 会读取并执行~/.bash_logou 中的内容。
non login shell
当一个非 login shell 的交互式 shell 启动时,bash 依次读取并执行 /etc/bash.bashrc, ~/.bashrc 中的内容
问题进一步描述
我在终端中第一次登录时,启动的 shell 为交互式的 login shell,因此不会读取并执行 ~/.bashrc 中的内容。而在 login shell 中执行 bash 命令,则启动了一个非 login shell 的交互式 shell,因此会读取并执行 ~/.bashrc 文件中的内容。
解决方案
如果你要在这两种不同的 shell 登录时都能加载 .bashrc 配置文件,那么你可以修改 .profile 文件,在其中加入加载 .bashrc 文件的操作。
下面是一个示例:
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
上面的示例实现的功能是判断家目录下是否存在普通文件 .bashrc,如果存在则加载此文件。