我已经使用了多年来基于* nix的系统,看起来我使用的Bash的每种风格都有不同的算法来决定运行哪些启动脚本。出于设置环境变量和别名以及打印启动消息(例如MOTD)等任务的目的,哪个启动脚本是执行这些操作的适当位置?
将内容置于.bashrc
,.bash_profile
和.environment
之间有什么区别?我还看过其他文件,例如.login
,.bash_login
和.profile
;这些是否相关?在物理登录,通过ssh远程登录以及打开新的终端窗口时,运行哪些不同?跨平台(包括Mac OS X(及其Terminal.app)和Cygwin Bash)是否存在显着差异?
答案 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操作系统中工作时,这似乎是一团糟。