【问题标题】:Why Bash have such strange behavior regarding to the startup file为什么 Bash 对启动文件有如此奇怪的行为
【发布时间】:2014-02-26 23:01:28
【问题描述】:

我发现了 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 不只读取一个“全局”和一个“用户特定”启动文件?

【问题讨论】:

    标签: linux macos bash shell unix


    【解决方案1】:

    原因是使用 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 定义提示是没有意义的,因此它进入了不同的配置脚本。

    【讨论】:

    • 所以它基本上是这样的:Bash 搜索最“合适的”文件,如果它找到一些“特定于 bash 的”文件,例如 ->“~/.bash_profile”,它会认为:嘿!如果用户为 bash 定义了特定文件,如果他 [user] 需要,他现在将负责采购其他内容,例如 ~/.profile - 由于这个原因,它停止读取队列中的以下文件?
    • 是的。这是一种简单的 OO 机制,可以在 shell 和用例之间扩展/继承配置选项。
    • 好吧,对我来说 OO 机制是什么时候,它只是按顺序读取这些文件。假设 LAST ONE 可以覆盖之前定义的所有内容(有点像:~/.bash_login extends ~/.bash_profile 和 ~/.profile extends ~/.bash_login)
    • 我认为同时拥有.bash_profile.bash_login 是为了csh 用户的利益,.login 相当于.profile.bash_profile 将优先作为两者中更多的“bash-like”。
    【解决方案2】:

    Bash 有多种不同的启动方式,每种方式都允许进行不同的配置。其中包括交互式、非交互式、登录、非登录、sh 以及这些的任意组合。

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

    编辑:

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

    【讨论】:

    • 你回答得真含糊。我问的是“什么”是有意义的,而不是“是否”它有任何意义。
    • 您是否要求证明这种机制的合理性?如果是这样,就像我说的那样,它是为了使用的灵活性。
    • 我特别问了为什么这个队列 -> ~/.bash_profile、~/.bash_login 和 ~/.profile 以及 Bash 的逻辑:“如果这些文件中的任何一个存在并且是可读的,请不要'T read next in the queue"
    • 我已经更新了答案以尝试回答这个具体问题。
    猜你喜欢
    • 2018-09-13
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    相关资源
    最近更新 更多