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

我已经使用了许多不同的基于nix的系统,看起来每个Bash的风格都有不同的algorithm来决定运行哪个启动脚本。 对于设置环境variables和别名以及打印启动消息(例如MOTD)这样的任务而言,哪个启动脚本是适当的位置?

把东西放在.bashrc.bash_profile.environment之间有什么区别? 我也看到了其他文件,如.login.bash_login.profile ; 这些有关吗? 在物理上login,通过ssh远程login,打开一个新的terminal窗口时,有什么区别呢? 跨平台(包括Mac OS X(及其Terminal.app)和Cygwin Bash)有什么重大差异?

与shellconfiguration文件的主要区别是有些只能通过“login”shell(例如从另一个主机login,或者在本地unix机器的文本控制台login)读取。 这些是所谓的.login.profile.zlogin (取决于您使用的是哪个shell)。

然后你就有configuration文件,这些文件是由“交互式”shell读取的(例如,连接到terminal的configuration文件(或者在terminal仿真器的窗口系统下运行的伪terminal),这些configuration文件是带有名称如.bashrc.tcshrc.zshrc

bash使这个变得复杂化了.bashrc 只能被交互式非login shell读取 ,所以你会发现大多数人最终都会告诉他们的.bash_profile也读取类似于.bashrc的东西

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

其他的shell有不同的performance – 例如zsh.zshrc总是被读取为一个交互式shell,不pipe它是否是一个login。

bash的手册页说明了每个文件被读取的情况。 是的,机器之间的行为通常是一致的。

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

这很简单。 这是在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 

loginshell是您login时读取的shell(例如,仅在启动xterm时,它们不会被执行)。 还有其他的方法来login。 例如使用X显示pipe理器。 那些在login时有其他方式来读取和导出环境variables。

另请阅读手册中的“ INVOCATION一章。 它说: “以下段落描述了bash如何执行启动文件。” ,我认为这是一个现成的:)它解释了什么是“交互式”的shell。

Bash不知道。 .environment 。 我怀疑这是你的发行版的一个文件,设置独立于你驱动的shell的环境variables。

传统上, ~/.profile被Bourne Shell使用,可能被Bash支持作为一个传统的措施。 再次, ~/.login~/.cshrc被C Shell使用 – 我不确定Bash是否使用它们。

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

其中一个后果是~/.bashrc中的东西应该尽可能的轻量级(最小),以减less启动非loginshell的开销。

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

我在这里find关于.bashrc和.bash_profile的信息来总结一下:

.bash_profile在您login时执行。 你放在那里的东西可能是你的PATH和其他重要的环境variables。

.bashrc用于非loginshell。 我不确定这是什么意思。 我知道RedHat每次启动另一个shell(su给这个用户或者简单地再次调用bash)时都会执行它。你可能想把别名放在那里,但是我不确定这是什么意思。 我自己简单地忽略它。

.profile相当于.bash_profile的根。 我认为这个名字被改变了,让其他的shell(csh,sh,tcsh)也使用它。 (你不需要一个用户)

还有.bash_logout执行,是啊好猜…登出。 你可能想停止deamons,甚至做一个小家务。 如果要在注销时清除屏幕,还可以在其中添加“清除”。

此处还有对每个configuration文件的完整跟踪

这些甚至可能是基于发行版的,并不是所有的发行版都select与它们configuration,有些甚至更多。 但是,当他们有相同的名字,他们通常包括相同的内容。

根据Josh Staiger的说法,Mac OS X的Terminal.app实际上为每个新的terminal窗口运行一个loginshell而不是非loginshell,调用.bash_profile而不是.bashrc。

他build议:

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

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

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

现在,当您从控制台login到您的机器时,将会调用.bashrc。

一个很好的地方是bash的man page。 这是一个在线版本。 查找“INVOCATION”部分。

我使用了Debian系列发行版,它似乎执行.profile ,但不是.bash_profile ,而RHEL衍生版在.profile之前执行.bash_profile

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