为什么Bash对启动文件有如此奇怪的行为

时间:2014-02-03 12:40:23

标签: linux macos bash shell unix

我发现了bash如何读取启动文件:

  

当Bash作为交互式登录shell或作为具有--login选项的非交互式shell调用时,它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。在读取该文件之后,它按顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在且可读的第一个命令中读取并执行命令。启动shell以禁止此行为时,可以使用--noprofile选项。

http://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files

为什么 - 我的意思是“〜/ .bash_profile,〜/ .bash_login和〜/ .profile”这个队列。 (而且这个逻辑 - “如果其中一个文件存在,那么其他文件根本就不会被阅读”)

我真的不明白这一点,为什么我们需要那么多混乱。为什么Bash不只是只读一个“全局”和一个“用户特定”的启动文件?

2 个答案:

答案 0 :(得分:2)

Bash有许多不同的启动方式,每种方式都允许不同的配置。这些包括,交互式,非交互​​式,登录,非登录,sh和这些的任意组合。

你可能会混淆什么对你来说更容易,对于有不同要求的其他人来说会更容易。这几乎是linux / unix的方式。

编辑:

文件加载顺序的原因是.bash_login和.profile是.bash_profile的同义词。它们来自C shell .login 文件和bourne shell和korn shell .profile 。据我了解,这种排序允许与这些其他shell的向后兼容性(在C shell的情况下不成功)。

答案 1 :(得分:2)

原因是有不同的方法来使用shell,有不同的shell,你可能想要共享/重用一些选项(或不!)。

例如,从Bourne Shell派生的所有shell都读取~/.profile。因此,如果您想在/bin/sh/bin/ksh/bin/bash之间分享选项,请将它们放在那里。

但是,您可能需要BASH和KSH的不同选项。在这种情况下,分别使用.bash_profile.kshrc,并让他们找到共同的~/.profile

使用上述规则,您可以微调shell的设置。它将首先加载最适合其目的的配置文件。在所述配置文件中,您可以选择加载其他人以继承您想要的任何内容。如果您只使用.profile,那么可以轻松地在不同的shell之间切换。

我不确定.bash_profile.bash_login之间的区别;也许这是一个错误或设计变化的遗留物。

登录脚本仅针对登录shell执行(即系统在用户登录时创建的第一个shell;所有其他shell和进程将是其子级)。登录shell包含您想要的所有全局变量。一个常见的例子是SSH代理的ID,因此您可以在任何shell中加载密钥,它们将适用于同一用户的每个进程。对你开始的每一个shell都没有意义。

另一方面,定义非交互式shell的提示是没有意义的,因此这将进入另一个配置脚本。