Bash 和 Zsh 启动文件采购顺序的完整概述

Bash 和 Zsh 启动文件采购顺序的完整概述

我很困惑我的 shell 以什么顺序来获取哪些文件。在自己研究这个问题时,我在网上找到了几个资料,甚至阅读了两个 shell 手册的某些部分。但有时,信息似乎相互矛盾且错误。

我知道不可能对所有 shell 进行完美概述,但是否有一些概述可以显示 Bash 和 Zsh 以什么顺序/情况获取了哪些文件?例如,当 shell 为非交互式时,获取文件的方式有何不同?

答案1

通过此概述,我希望消除任何困惑,并介绍一个简单的概述,说明在什么情况下为 Bash 和 Zsh 提供哪些文件。下图已在 VM 上的 archlinux vanilla 安装上进行了测试。

初创公司提交采购订单

猛击

Bash 启动文件流程图

扎什

Zsh 启动文件流程图

上面的图表显示了脚本的来源顺序,具体取决于 shell 是登录、非登录、交互还是非交互。要遵循一个组合的来源顺序,请从最左边的节点开始并“选择”您的组合。您最终只会得到一种颜色,同时通过登录/交互两种选择:这就是要遵循的颜色!

图表注释

如果中的文件/etc/zsh/存在于 中/etc/,则其功能完全相同。两个路径相同,并且均来自 。此外,此图假设ZDOTDIR未设置。如果设置,则 中的所有文件~均来自ZDOTDIR

笔记

启动文件的类型(概述)

图表很棒,但是文字也有其细微差别,所以就这样。

有 X 种类型的启动文件(shell 启动时获取的文件):'env'、'profile'、'rc'、'login' 和 'logout',它们都来源于此 presedence。根据您的 shell,这些类型的文件的名称略有不同。所有这些类型,都有系统范围和用户范围的变体,分别放在 和 中/etc$HOME中的那些$HOME仅适用于所属用户,但系统范围的那些由每个人(甚至是 root)获取,并由系统管理员维护。

'env' 文件仅用于定义全球的变量,仅此而已!配置文件通常定义更具体的变量和函数。'rc 文件旨在用于交互式 shell,通过提示符和其他工具等丰富 shell,使交互更加轻松。'login' 和 'logout' 用于登录和注销,这样您就可以在获取某些内容时有额外的选择。

启动文件的预期用途

启动文件的所有初衷可能都不够明显。因此,这里对一些文件进行了额外的解释:

  • /etc/profile:通常用于来源/etc/bash.bashrc
  • *zlogin: 的用途与 完全相同*zprofile,但适用于依赖其他文件完全配置的 shell 的逻辑。其唯一区别在于,它确实在 之后*zshrc而不是之前被调用。通常用于运行startx或其他显示管理器。
  • /etc/zsh/zprofile必须source/etc/profile否则emulate sh -c一些常用脚本比如 make 将会中断。
  • /etc/bash.bashrc:通常会加载 bash_functions。
  • ~/.bash_profile:通常用于获取来源,~/.bashrc因为~/.bashrc在登录 shell 中时不会获取来源 - 但在某些情况下您会主动使用登录 shell。

其他值得注意的评论

  • 一些发行版(我相信至少是 Manjaro)也有 Zsh 文件/etc/,而不是/etc/zsh/。 两者相同,而在 Manjaro 上只会获取其中一个。
  • 一些发行版,例如 ubuntu,有可供使用的额外启动文件。
  • bash 中的注销脚本不会在非交互式 shell 中运行,除非执行byelogout或(或其他类似命令)。exit
  • 请意识到*zshenv甚至来自make!(因此,请尽可能保持这些文件简单。)*zshenv因此,建议文件中的命令始终用以下代码括起来:
if [[ ! -o norcs ]]; then
    echo 'your command'
fi

Zsh 和 Bash 的主要区别

Bash 似乎将登录 shell 的启动文件与交互式 shell 分开。如果交互式登录 shell 运行显示管理器,则通常不需要交互式 shell 所需的配置,因为无论如何您都不会直接与其交互。但是,在其他情况下(例如,使用 SSH 时),您希望获取这些交互式 shell 配置。

Zsh 不会将两者分开:交互时运行交互脚本,登录 shell 时运行登录 shell;很简单。

另外,请注意~/.profile不是由 zsh 提供的,而是用它自己的替换~/.zprofile

我的采购订单是什么?

我测试了完整的采购订单,通过在前面添加以下行每一个启动文件,其中FILE_NAME启动文件的名称是:

export startup_trace="$startup_trace\nFILE_NAME"

对于*logout启动文件,我改为回显文件名,因为退出后无法打印更新的跟踪。

例如,要测试非交互式 Zsh 登录 shell 的跟踪,请运行以下命令:

su $SOME_USER -ls /bin/zsh -c 'setopt; echo -e $startup_trace; exit'

这将按顺序打印所有来源文件。请注意如何exit测试*logout启动文件。

相关内容