.bashrc,.bash_profile和.environment之间有什么区别?

时间:2009-01-06 03:58:35

标签: shell environment bash

我已经使用了多年来基于* nix的系统,看起来我使用的Bash的每种风格都有不同的算法来决定运行哪些启动脚本。出于设置环境变量和别名以及打印启动消息(例如MOTD)等任务的目的,哪个启动脚本是执行这些操作的适当位置?

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

7 个答案:

答案 0 :(得分:73)

与shell配置文件的主要区别在于,有些只能通过“登录”shell读取(例如,当您从其他主机登录或在本地unix机器的文本控制台登录时)。这些就是所谓的.login.profile.zlogin(取决于您使用的是哪个shell)。

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

bash会使.bashrc 仅由交互式非登录 的shell读取>,所以你会发现大多数人最终都告诉他们.bash_profile还要用{/ p>这样的内容来阅读.bashrc

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

其他shell的行为方式不同 - 例如,对于zsh,始终会为交互式shell读取.zshrc,无论是否为登录shell。

bash的手册页介绍了读取每个文件的环境。是的,机器之间的行为通常是一致的。

.profile只是/bin/sh最初使用的登录脚本文件名。 bash/bin/sh通常向后兼容,如果存在,则会显示.profile

答案 1 :(得分: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的环境变量。

答案 2 :(得分:9)

经典地,Bourne Shell使用~/.profile,并且Bash可能支持将其作为遗留度量。同样,C Shell使用了~/.login~/.cshrc - 我不确定Bash是否会使用它们。

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

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

我相信~/.environment文件是Korn Shell的兼容性文件。

答案 3 :(得分:7)

我找到了有关.bashrc和.bash_profile here的信息来总结:

  当你执行

.bash_profile   登录。你放入的东西可能有   你的PATH和其他重要的   环境变量。

     

.bashrc用于非登录shell。   我不确定这意味着什么。我知道   那个RedHat   每次开始时执行它   另一个shell(su给这个用户或者   只是再次调用bash)你可能会   想把别名放在那里,但又来了   我不确定这意味着什么。一世   简单地忽略它。

     

.profile相当于   .bash_profile为root。我认为   将名称更改为让其他名称   shell(csh,sh,tcsh)也使用它。   (你不需要一个用户)

     

还有.bash_logout   执行,是的好猜...退出。   你可能想要停止deamons甚至   做一点管家。您可以   如果你愿意,还可以在那里添加“清除”   当你退出时清除屏幕。

此外,每个配置文件here

都有完整的跟进

这些甚至可能是依赖于发行版的,并非所有发行版都选择与它们进行每次配置,而有些发行版甚至更多。但是当它们具有相同的名称时,它们通常会包含相同的内容。

答案 4 :(得分:4)

根据Josh Staiger,Mac OS X的Terminal.app实际上默认为每个新的终端窗口运行一个登录shell而不是非登录shell,调用.bash_profile而不是.bashrc。

他建议:

  

大多数情况下,您不希望维护两个单独的配置文件   对于登录和非登录shell - 当您设置PATH时,您希望它   适用于两者。您可以通过从您的.bashrc获取.bashrc来解决此问题   .bash_profile文件,然后将PATH和常用设置放在.bashrc中。

     

为此,请将以下行添加到.bash_profile:

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

现在当你登录你的   来自控制台.bashrc的机器将被调用。

答案 5 :(得分:2)

一个好看的地方是bash的手册页。 Here是一个在线版本。寻找“INVOCATION”部分。

答案 6 :(得分:0)

我使用的Debian家族发行版似乎执行.profile,但不是.bash_profile, 而RHEL衍生品在.bash_profile之前执行.profile

当你必须设置环境变量以在任何Linux操作系统中工作时,这似乎是一团糟。