.profile .bash_profile 和 .bashrc 之间的功能区别是什么

.profile .bash_profile 和 .bashrc 之间的功能区别是什么

.profile.bash_profile和文件之间有哪些功能差异.bashrc

答案1

.bash_profile.bashrc特定于bash,而.profile在没有自己的 shell 特定配置文件的情况下,许多 shell 都会读取 。 (.profile由原始 Bourne shell 使用。) .bash_profile.profile由登录 shell 以及 读取.bashrc;子 shell 只读取.bashrc。 (在作业控制和现代窗口系统之间,.bashrc本身并不常用。如果使用screentmux,屏幕/窗口通常会运行子 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 终端仿真器可能会执行相同的操作,但大多数往往不会这样做。

更多内容请见:.bash_profile 与 .bashrc - 作者:Josh Staiger

答案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 中指定绝对路径,因为默认情况下不会执行任何配置文件。

这是我的消息来源

bash(1) - Linux 手册页

相关内容