“.bashrc”、“ .bash_profile”和“ .environment”有什么区别?它们与编程有关。

129

我使用了多个基于*nix的系统,似乎每个Bash版本都有不同的算法来决定运行哪些启动脚本。对于设置环境变量、别名和打印启动消息(例如MOTD)等任务,哪个启动脚本是适当的位置呢?

将内容放在.bashrc.bash_profile.environment有什么区别?我还看到其他文件,如.login.bash_login.profile;它们是否相关?这些文件在物理登录、通过ssh远程登录以及打开新的终端窗口时运行的区别是什么?是否在平台(包括Mac OS X(及其Terminal.app)和Cygwin Bash)之间存在重大差异?

7个回答

72

shell配置文件与之不同的主要区别在于,有些配置文件仅由“登录”shell(例如,当您从另一台主机登录或在本地Unix机器的文本控制台上登录时)读取。这些被称为.login.profile.zlogin(取决于您使用的shell)。

然后,您还有一些配置文件是由“交互式”shell读取的(也就是,连接到终端的shell(或伪终端,例如在窗口系统下运行的终端仿真器)。这些文件的名称类似于.bashrc.tcshrc.zshrc等。

bash在这方面更加复杂,因为.bashrc只会被一个既是交互式又是非登录的shell读取,所以大多数人会告诉他们的.bash_profile同时读取.bashrc,类似于:

[[ -r ~/.bashrc ]] && . ~/.bashrc

其他shell的行为不同-例如,在zsh中,无论是否为登录shell,.zshrc始终会被读取。

bash的手册页面解释了每个文件被读取的情况。是的,行为通常在机器之间保持一致。

.profile只是最初由/bin/sh使用的登录脚本文件名。bash通常与/bin/sh向后兼容,如果存在.profile,它将读取该文件。


48

很简单,它在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 是在您登录时读取的 shell(因此,它们不会在仅启动 xterm 时执行)。还有其他的登录方法,例如使用 X 显示管理器。这些程序有其他方法在登录时读取和导出环境变量。

此外,在手册中阅读 INVOCATION 章节。它说:"以下段落描述了 bash 如何执行其启动文件.",我认为这是非常准确的 :) 它还解释了 "交互式" shell 是什么。

Bash 不知道 .environment。我怀疑那是您发行版的文件,用于独立于所使用的 shell 设置环境变量。


1
你能添加/etc/bashrc来满足这个答案吗? - Nemoden

9
经典地,~/.profile 由 Bourne Shell 使用,并且可能作为 Bash 的遗留措施得到支持。同样,~/.login~/.cshrc 被 C Shell 使用 - 我不确定 Bash 是否完全使用它们。

~/.bash_profile 在登录时使用一次。每次启动 shell 时都会读取 ~/.bashrc 脚本。这类似于 C Shell 的 /.cshrc

一个结果是,~/.bashrc 中的内容应尽可能轻量级(最小化),以减少启动非登录 shell 的开销。

我认为 ~/.environment 文件是 Korn Shell 的兼容性文件。


7
我找到了有关.bashrc和.bash_profile的信息在这里总结如下:

.bash_profile是当您登录时执行的。您放置在其中的内容可能是您的PATH和其他重要环境变量。

.bashrc用于非登录shell。我不确定这是什么意思。我知道RedHat每次启动另一个shell(su到此用户或仅再次调用bash)时都会执行它。您可能想在其中放置别名,但我再次不确定这是什么意思。我只是自己忽略它。

.profile是root的.bash_profile等效项。我认为更改名称是为了让其他shell(csh、sh、tcsh)也使用它。(您不需要作为用户拥有一个)

还有.bash_logout,它在退出时执行。您可能需要停止deamons甚至进行一些清理工作。您还可以在那里添加“clear”,如果您想在注销时清除屏幕。

此外,还有每个配置文件的完整后续在这里

这些可能是特定于发行版的,不是所有发行版都选择将每个配置与它们一起使用,有些甚至拥有更多。但当它们具有相同的名称时,它们通常包含相同的内容。


4
根据Josh Staiger的说法,Mac OS X的Terminal.app默认为每个新终端窗口运行登录shell而不是非登录shell,调用.bash_profile而不是.bashrc。
他建议:

Most of the time you don’t want to maintain two separate config files for login and non-login shells — when you set a PATH, you want it to apply to both. You can fix this by sourcing .bashrc from your .bash_profile file, then putting PATH and common settings in .bashrc.

To do this, add the following lines to .bash_profile:

if [ -f ~/.bashrc ]; then 
    source ~/.bashrc 
fi

Now when you login to your machine from a console .bashrc will be called.


2
一个好的参考资料是bash的man页面。这里有一个在线版本(链接),请查找“INVOCATION”部分。

0

我曾经使用过Debian系列的发行版,它们似乎执行.profile,但不执行.bash_profile, 而RHEL衍生版本在执行.profile之前会先执行.bash_profile

当你需要在任何Linux操作系统中设置环境变量时,这似乎是一件麻烦的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接