130

这些年来,我使用了许多不同的基于 *nix 的系统,似乎我使用的每一种 Bash 都有不同的算法来决定运行哪些启动脚本。对于设置环境变量和别名以及打印启动消息(例如 MOTD)等任务,哪个启动脚本适合执行这些任务?

.bashrc把东西放进去,.bash_profile和有什么区别.environment?我还看到了其他文件,例如.login,.bash_login.profile; 这些有关系吗?物理登录、通过 ssh 远程登录和打开新的终端窗口时运行的有什么区别?跨平台(包括 Mac OS X(及其 Terminal.app)和 Cygwin Bash)是否存在显着差异?

4

7 回答 7

73

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

然后你有由“交互式”shell读取的配置文件(例如,连接到终端的那些(或伪终端,例如,在窗口系统下运行的终端模拟器)。这些是有名字的比如.bashrc, .tcshrc,.zshrc

bash使这一点复杂化,因为.bashrc它只能由交互式非登录的 shell 读取,所以你会发现大多数人最终告诉他们.bash_profile也要阅读.bashrc类似的东西

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

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

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

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

于 2009-01-06T04:18:33.397 回答
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 是在您登录时读取的那些(例如,仅在启动 xterm 时不会执行它们)。还有其他登录方式。例如使用 X 显示管理器。那些有其他方法可以在登录时读取和导出环境变量。

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

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

于 2009-01-06T15:21:30.877 回答
9

经典地,~/.profile被 Bourne Shell 使用,并且可能被 Bash 支持作为遗留措施。再次,~/.login并被~/.cshrcC Shell 使用——我不确定 Bash 是否使用它们。

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

一个后果是,在启动非登录 shell 时,里面的东西~/.bashrc应该尽可能轻量(最小)以减少开销。

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

于 2009-01-06T04:13:18.823 回答
7

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

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

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

.profile 相当于根的 .bash_profile。我认为更改名称是为了让其他 shell(csh、sh、tcsh)也可以使用它。(您不需要一个作为用户)

还有 .bash_logout 执行,是的,很好的猜测......注销。你可能想停止恶魔,甚至做一些家务。如果您想在注销时清除屏幕,也可以在此处添加“清除”。

还有一个完整的跟进每个配置文件here

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

于 2009-01-06T04:03:39.043 回答
4

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

他建议:

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

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

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

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

于 2012-02-27T00:22:05.517 回答
2

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

于 2009-01-06T04:06:21.893 回答
0

我使用了 Debian 系列发行版,它们似乎可以执行.profile,但不是.bash_profile,而 RHEL 衍生产品.bash_profile.profile.

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

于 2012-05-21T10:42:00.943 回答