.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]