debian:bash 会话配置文件的读取顺序不一致

debian:bash 会话配置文件的读取顺序不一致

三个文件是按这个顺序读取的?

.bash_profile
.profile
.bashrc

当我第一次打开终端时,这种情况不会发生。

我在附加到文件 init.log 的文件中有跟踪语句。请看下面的内容。它在打开终端后开始。我添加了一条注释来显示在 su 命令之后日志的位置。

stephen@debian:~$ cat init.log
reading .bashrc
done reading .bashrc
stephen@debian:~$ su - stephen
Password: 
stephen@debian:~$ cat init.log
reading .bashrc
done reading .bashrc
#
# after su
#
reading .bash_profile
reading .profile
reading .bashrc
done reading .bashrc
done reading .profile
done reading .bash_profile
stephen@debian:~$ 

因此,su - 登录会触发预期的序列,但初始登录仅读取bashrc。这不可能是正确的。有人可以解释一下在什么条件下会发生这种情况。我可以修改 bashrc 和配置文件,以便初始读取包括所有预期的文件,但我宁愿找到问题的根源并在那里修复它。

答案1

答案是 bash 将查找这三个文件(情况略有不同),但通常只会执行其中之一。

当运行一个登录shell(通常当您在终端上登录时,或者当您打开 GNOME 终端或类似终端时,或者当您使用时su -),更具体地说是交互式登录 shell 时,它将在系统范围内执行/etc/profile,完成后,它会看起来为~/.bash_profile,~/.bash_login~/.profile并执行第一的它找到的那些。

从 bash 手册页:

当 bash 作为交互式登录 shell 或带有该选项的非交互式 shell 被调用时--login,它首先从文件中读取并执行命令 /etc/profile(如果该文件存在)。读取该文件后,它会按顺序查找~/.bash_profile~/.bash_login、 和~/.profile,并从第一个存在且可读的文件中读取并执行命令。--noprofile当 shell 启动时可以使用该选项来禁止此行为。

当 bash 作为交互式 shell(更具体地说是交互式非登录 shell)执行时,它将读取~/.bashrc并执行该文件。

从 bash 手册页:

当启动非登录 shell 的交互式 shell 时,bash 会读取并执行来自 的命令(~/.bashrc如果该文件存在)。这可以通过使用该--norc选项来抑制。 file--rcfile 选项将强制 bash 从文件而不是~/.bashrc.

Linux 发行版通常所做的是发布~/.bash_profile,~/.profile以及~/.bashrc相互链接的文件,这样您就可以拥有更一致的行为,而不必在文件之间重复设置......

例如,Debian 的默认~/.profile包含以下代码片段:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

因此,它是显式 source 的~/.bashrc,因此登录和非登录交互式 shell 都将包含添加到该文件的自定义内容。

相关内容