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


130

多年来,我使用了许多不同的基于* nix的系统,而且似乎我使用的每种Bash都有不同的算法来确定要运行的启动脚本。出于诸如设置环境变量和别名以及打印启动消息(例如MOTD)之类的任务的目的,哪个启动脚本是执行这些操作的合适位置?

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

Answers:


73

与shell配置文件的主要区别在于,有些配置文件只能通过“登录” shell读取(例如,当您从另一台主机登录时,或者在本地unix计算机的文本控制台上登录时)。这些是所谓的,例如,.login或,.profile.zlogin(取决于您所使用的外壳)。

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

bash复杂的是,.bashrc只能由交互式非登录外壳读取,因此您会发现大多数人最终都告诉他们.bash_profile也要读取.bashrc类似的内容

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

其他shell的行为有所不同-例如zsh.zshrc对于,无论交互式交互式shell是否登录,总是使用读取。

bash的手册页介绍了在什么情况下读取每个文件。是的,机器之间的行为通常是一致的。

.profile只是由最初使用的登录脚本文件名/bin/shbash,通常与向后兼容/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

登录外壳是您登录时读取的外壳(例如,仅在启动xterm时不执行它们)。还有其他登录方式。例如,使用X显示管理器。这些还有其他在登录时读取和导出环境变量的方法。

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

巴什不知道.environment。我怀疑这是您的发行版文件,用于设置独立于您驱动的shell的环境变量。


1
您能补充/etc/bashrc一下答案吗?
Nemoden 2012年

9

传统上,~/.profileBourne Shell使用它,并且Bash可能会将它作为传统措施来支持。再次,~/.login并且~/.cshrc被C Shell使用-我不确定Bash是否完全使用它们。

~/.bash_profile将被使用一次,在登录。~/.bashrc每次启动外壳程序时都会读取该脚本。这类似于/.cshrcC Shell。

结果是,装入的内容~/.bashrc应尽可能轻巧(最小),以减少启动非登录外壳程序时的开销。

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


7

我在这里找到有关.bashrc和.bash_profile的信息以进行总结:

登录时将执行.bash_profile。输入的内容可能是PATH和其他重要的环境变量。

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

.profile相当于根目录的.bash_profile。我认为名称已更改为允许其他shell(csh,sh,tcsh)也使用它。(您不需要一个用户)

还有.bash_logout,它执行的位置,是的,很不错...注销。您可能想要停止重婚,甚至做些家务。如果您要在注销时清除屏幕,也可以在此处添加“清除”。

也有是在每个配置文件的完整随访这里

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


4

根据Josh Staiger的说法,Mac OS X的Terminal.app实际上默认情况下为每个新的终端窗口运行登录外壳程序而不是非登录外壳程序,并调用.bash_profile而不是.bashrc。

他建议:

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

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

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

现在,当您从控制台登录到计算机时,将调用.bashrc。


2

一个不错的地方是bash的手册页。是在线版本。查找“邀请”部分。


0

我使用了Debian系列发行版,这些发行版似乎执行了.profile,但是没有执行.bash_profile,而RHEL派生版.bash_profile之前执行了.profile

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.