.profile
、.bash_profile
和文件之间有哪些功能差异.bashrc
?
答案1
.bash_profile
和.bashrc
特定于bash
,而.profile
在没有自己的 shell 特定配置文件的情况下,许多 shell 都会读取 。 (.profile
由原始 Bourne shell 使用。) .bash_profile
或.profile
由登录 shell 以及 读取.bashrc
;子 shell 只读取.bashrc
。 (在作业控制和现代窗口系统之间,.bashrc
本身并不常用。如果使用screen
或tmux
,屏幕/窗口通常会运行子 shell 而不是登录 shell。)
其背后的想法是一次性设置由.profile
(或其特定于 shell 的版本) 完成,每个 shell 的内容由 完成.bashrc
。例如,您通常只希望每个会话加载一次环境变量,而不是在会话中启动子 shell 时让它们被重击,而您总是希望您的别名 (它们不会像环境变量那样自动传播)。
其他值得注意的 shell 配置文件:
/etc/bash_profile
(fallback /etc/profile
)在用户配置之前被读取,.profile
用于系统范围的配置,/etc/bashrc
子 shell 中也是如此(此配置无 fallback)。许多系统(包括 Ubuntu)还使用/etc/profile.d
包含 shell scriptlet 的目录,这些脚本由.
(source
)编辑而成/etc/profile
;此处的片段是针对每个 shell 的,*.sh
适用于所有 Bourne/POSIX 兼容 shell 和适用于该特定 shell 的其他扩展。
答案2
.profile
.profile
用于与 Bash 没有特别关系的东西,比如环境变量PATH
和朋友,并且应该随时可用。
例如,.profile
在启动图形桌面会话时也应该加载。
.bashrc
.bashrc
用于配置交互式 Bash 使用,如 Bash 别名、设置您最喜欢的编辑器、设置 Bash 提示符等。
.bash_profile
.bash_profile
是为了确保.profile
和里面的东西都.bashrc
装好了登录 shell。
例如,.bash_profile
可以是这样的
. ~/.profile
. ~/.bashrc
如果省略.bashrc
,则仅.profile
会加载。
答案3
根据 bash 手册页,.bash_profile
对于登录 shell 执行,而.bashrc
对于交互式非登录 shell 执行。
那么,什么是登录或非登录 shell?
当您通过控制台登录(输入用户名和密码)时,无论是坐在机器旁,还是通过 ssh 远程登录:.bash_profile
在初始命令提示符之前执行以配置您的 shell。但是,如果您已经登录到您的机器并在 Gnome 或 KDE 中打开新的终端窗口 (xterm),则.bashrc
在窗口命令提示符之前执行。当您通过在终端中.bashrc
键入来启动新的 bash 实例时也会运行。/bin/bash
终端窗口指南的一个例外是 Mac OS X 的 Terminal.app,它默认为每个新终端窗口运行一个登录 shell,调用.bash_profile
而不是.bashrc
。其他 GUI 终端仿真器可能会执行相同的操作,但大多数往往不会这样做。
答案4
我求助于手册页来寻找这个答案(man bash
)。
这三个文件都是 bash 在不同的场景中使用的。
场景 1:交互式登录外壳 (交互式意味着您可以进行用户输入。请注意,这不包括 cron 作业!登录 shell 是您登录时生成的第一个 shell,但不包括子 shell)所以基本上这是您登录时获得的命令提示符。bash 会做什么?Bash 每次都会读取 /etc/profile。然后,它会查找 ~/.bash_profile。如果不存在,它会查找 ~/.bash_login。如果不存在,它会查找 ~/.profile。但它只会读取 .bash_profile、.bash_login 和 .profile 中的一个。因此,它在找到并读取后就会退出。
场景 2:交互式非登录 (这是在第一个登录 shell 之后启动的 shell。此 shell 允许用户输入。)当启动交互式非登录 shell 时:Bash 只读取 /etc/bash.bashrc 和 ~/.bashrc。
场景 3:非交互式 shell (例如 cronjob)非交互式时,它根本不加载任何文件。但是,它会查找一个名为 BASH_ENV 的环境变量,该变量应该包含将要执行的文件的路径。因此在这种情况下,除非您明确将 BASH_ENV 设置为绝对路径,否则它不会读取任何 ~/.profile 或 ~/.bash_profile 文件。我相信这就是为什么您应该始终在任何 cronjobs 中指定绝对路径,因为默认情况下不会执行任何配置文件。
这是我的消息来源