.zprofile .zshrc .zshenv .zlogin .zlogout 之间的区别

这些文件(.zprofile .zshrc .zshenv .zlogin .zlogout)都是Zsh配置文件,设置Zsh的环境变量。

Zsh是一个 UNIX 命令解释器(shell)。

文件位置

这些文件位于用户的主目录下,例如~/.zprofile

用法

~/.zprofile中放置登录时的配置(通常主要是环境变量),在~/.zshrc中放置交互式配置(提示符、补全、键绑定、别名等)。其他的启动文件你很少需要用到。

文件功能和差异

.zlogin

登录 shell中被读取。它应该包含只在登录 shell 中执行的命令。

.zprofile

.zlogin类似 - 它们为登录 shell 设置环境,不同的是它在.zshrc之前被读取。

.zshrc

交互式 shell中被读取。这个文件在.zprofile之后被加载。这通常是你"设置并忘记"的地方,比如你希望在登录和交互式 shell 中都有的$PATH$PROMPT、别名、函数、选项和键绑定等参数。 1

Note

*profile文件和*login文件在相同的条件下被读取:当且仅当 shell 是一个登录 shell(且没有使用像no_rcs这样的选项)。手册将它们分开列出是因为它们相对于*rc文件的调用顺序不同。

通常情况是使用*profile还是*login并不重要。但是*profile文件是在*rc之前被读取,所以如果有*rc的内容依赖于*profile的设置(例如,如果你的.zshrc调用了一个程序,该程序的路径是在.zprofile被添加到$PATH变量中),你需要使用*profile而不是*login。 [^2]

.zshenv

在所有的 shell 调用中都会被读取,除非设置了-f选项。它可以包含命令搜索路径的设置,以及其他重要的环境变量。但是不应该包含产生输出的命令,或者是连接到 tty 的 shell 命令。 2

这更多地是针对高级用户,对于像launchd调用的脚本来说,可能需要你的$PATH、$PAGER 或$EDITOR 变量。这些都在一个非交互式 shell下运行,所以.zprofile.zshrc中的任何内容都不会被加载。(个人来说,我不使用这个,因为我在脚本本身中设置了 PATH 变量以确保可移植性。) 1

zlogout

在登录 shell 退出时被源读取。这非常适合在你离开当前 shell 时做清理工作(比如清屏或重置终端窗口标题)。

操作顺序

请记住,它首先从系统级文件(即/etc/zshenv)读取,然后从你的用户主目录文件(~/.zshenv)读取,按照以下顺序进行。

.zshenv -> .zprofile -> .zshrc -> .zlogin -> .zlogout

  • .zshenv,在所有的 shell 中都会被源读取(无论是登录还是交互式,除非设置了-f选项)。
  • .zprofile,在登录 shell 中被源读取。
  • .zshrc,在交互式 shell 中被源读取。
  • .zlogin,在登录 shell 中被源读取。
  • .zlogout,在登录 shell 退出时被源读取。

Shells

交互式 shell

是那些输入和输出都连接到终端的 shell。

登录 shell

(无论是本地还是远程)允许用户进行系统认证并开始会话。这些 shell 通常是交互式的。

Note

在 macOS 上,Terminal 打开的 shell 既是登录 shell, 也是一个交互式 shell,尽管你没有进行认证(输入登录凭证)。不过,任何在其中打开的子 shell 都只是交互式的。

SSH 会话是登录和交互的,所以它们的行为就像你打开的 Terminal 会话一样,会读取.zprofile.zshrc。 [^2]