【问题标题】:What's the difference between .bashrc, .bash_profile, and .environment?.bashrc、.bash_profile 和 .environment 有什么区别?
【发布时间】:2010-09-29 17:56:03
【问题描述】:
这些年来,我使用了许多不同的基于 *nix 的系统,而且似乎我使用的每种 Bash 都有不同的算法来决定运行哪些启动脚本。对于设置环境变量和别名以及打印启动消息(例如 MOTD)等任务,哪个启动脚本适合执行这些任务?
将东西放入.bashrc、.bash_profile 和.environment 有什么区别?我还看到了其他文件,例如.login、.bash_login 和.profile;这些有关系吗?物理登录、通过 ssh 远程登录和打开新的终端窗口时运行的有什么区别?跨平台(包括 Mac OS X(及其 Terminal.app)和 Cygwin Bash)是否存在显着差异?
【问题讨论】:
标签:
shell
environment
bash
【解决方案1】:
我使用的 Debian 系列发行版似乎执行 .profile,但不是 .bash_profile,
而 RHEL 派生类在 .profile 之前执行 .bash_profile。
当您必须设置环境变量才能在任何 Linux 操作系统中工作时,这似乎是一团糟。
【解决方案2】:
与 shell 配置文件的主要区别在于,有些文件只能由“登录”shell 读取(例如,当您从另一台主机登录时,或在本地 unix 机器的文本控制台登录时)。这些被称为.login 或.profile 或.zlogin(取决于您使用的shell)。
然后,您就有了由“交互式”shell 读取的配置文件(例如,连接到终端的那些(或伪终端,例如,在窗口系统下运行的终端仿真器)。这些是名称如.bashrc、.tcshrc、.zshrc 等。
bash 使这变得复杂,因为.bashrc 只能被 交互式 和 非登录 的 shell 读取,所以你'会发现大多数人最终会告诉他们的.bash_profile 也阅读.bashrc 类似的东西
[[ -r ~/.bashrc ]] && . ~/.bashrc
其他 shell 的行为不同 - 例如,zsh,.zshrc 总是被读取用于交互式 shell,无论它是否是登录的。
bash 的手册页解释了读取每个文件的情况。是的,机器之间的行为通常是一致的。
.profile 只是/bin/sh 最初使用的登录脚本文件名。 bash,通常向后兼容/bin/sh,如果存在.profile,将读取。
【解决方案3】:
根据Josh Staiger,Mac OS X 的 Terminal.app 实际上默认为每个新终端窗口运行登录 shell 而不是非登录 shell,调用 .bash_profile 而不是 .bashrc。
他建议:
大多数时候您不想维护两个单独的配置文件
对于登录和非登录 shell——当你设置一个 PATH 时,你希望它
适用于两者。您可以通过从您的
.bash_profile 文件,然后将 PATH 和常用设置放入 .bashrc。
为此,将以下行添加到 .bash_profile:
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
现在,当您登录到您的
来自控制台的机器 .bashrc 将被调用。
【解决方案4】:
这很简单。在man bash中有解释:
/bin/bash
The bash executable
/etc/profile
The systemwide initialization file, executed for login shells
~/.bash_profile
The personal initialization file, executed for login shells
~/.bashrc
The individual per-interactive-shell startup file
~/.bash_logout
The individual login shell cleanup file, executed when a login shell exits
~/.inputrc
Individual readline initialization file
登录 shell 是在您登录时读取的那些(因此,它们不会在仅启动 xterm 时执行,例如)。还有其他登录方式。例如使用 X 显示管理器。那些有其他方法可以在登录时读取和导出环境变量。
另请阅读手册中的INVOCATION 章节。它说“以下段落描述了 bash 如何执行其启动文件。”,我认为这是一个点 :) 它也解释了“交互式”shell 是什么。
Bash 不知道.environment。我怀疑这是您的发行版文件,用于设置独立于您驱动的外壳的环境变量。
【解决方案5】:
我找到了关于 .bashrc 和 .bash_profile here 的信息来总结一下:
.bash_profile 在您执行时执行
登录。你放在那里的东西可能有
你的 PATH 和其他重要的
环境变量。
.bashrc 用于非登录 shell。
我不确定那是什么意思。我知道
那个红帽
每次开始时执行它
另一个外壳(su 到这个用户或
只需再次调用 bash)你可能
想把别名放在那里,但又一次
我不确定那是什么意思。一世
自己直接忽略吧。
.profile 相当于
.bash_profile 为根。我想
改名让其他
shells (csh, sh, tcsh) 也使用它。
(作为用户,您不需要一个)
还有 .bash_logout 至极
执行,是的,很好的猜测...注销。
你可能想停止恶魔甚至
做一点家务。你可以
如果您愿意,还可以在此处添加“清除”
注销时清除屏幕。
还有对每个配置文件here的完整跟进
这些甚至可能是依赖于发行版的,并非所有发行版都选择使用它们的每个配置,有些甚至更多。但是当它们具有相同的名称时,它们通常包含相同的内容。
【解决方案6】:
传统上,~/.profile 被 Bourne Shell 使用,并且可能被 Bash 支持作为遗留措施。同样,~/.login 和 ~/.cshrc 被 C Shell 使用——我不确定 Bash 是否使用它们。
~/.bash_profile 将在登录时使用一次。每次启动 shell 时都会读取 ~/.bashrc 脚本。这类似于 C Shell 的 /.cshrc。
一个结果是~/.bashrc 中的内容应该尽可能轻量级(最小化),以减少启动非登录 shell 时的开销。
我相信~/.environment 文件是 Korn Shell 的兼容性文件。
【解决方案7】:
bash 的手册页是一个值得一看的好地方。 Here 是在线版本。寻找“INVOCATION”部分。