三个文件是按这个顺序读取的?
.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 都将包含添加到该文件的自定义内容。