.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操作系统中工作时,它似乎是一团糟。