.zprofile, .zshrc和.zshenv之间的区别

12,567 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

macOS Monterey改变了默认的内置shell程序, 从之前的bash, 到现在的z-shell.

Z-shell有大量的启动文件和关机文件.

下面是这些文件的完整列表:

  • ~/.zprofile
  • ~/.zshrc
  • ~/.zshenv
  • ~/.zlogin
  • ~/.zlogout

~/.zprofile

~/.zprofile是这些启动文件和关机文件中的一个. 它在登录时被读取. 它的兄弟文件~/.zshrc则是在交互时读取.

登录式Shell和响应式Shell

什么是登录式? 什么又是响应式?

或者, 什么是一个登录式shell, 而又什么是一个响应式非登录shell?

登录式shell是一个你可以登录的shell. 登录式shell能够从命令行ps -f中识别出来.

chen.pan@Chens-MacBook-Pro ~ % ps -f
  UID   PID  PPID   C STIME   TTY           TIME CMD
  502  3057  2008   0  9:57AM ttys000    0:00.02 /bin/zsh --login -i
  502  3103  3101   0  9:58AM ttys001    0:00.29 -zsh

响应式非登录shell通常是一个shell环境, 你可以从中读写(比如, 典型的终端会话).

响应式非登录shell则能够从登录式shell中触发, 比如当你写出zsh并且压入命令行时. 或者当你打开新的终端tab的时候.

放什么东西进~/.zprofile而又放什么东西进~/.zshrc?

因为~/.zprofile 只在登录时加载一次, 所以最好把只加载一次的东西放进里面, 之后还能被子shell继承, 比如环境变量, 这是非常好的例子.

在另一方面,  ~/.zshrc通常会保留那些不能被子shell继承的东西, 比如别名和函数, 自定义提示, 历史自定义等等. 除此之外, 每次启动新shell都会运行的命令应该被放进 ~/.zshrc 文件.

什么是~/.zshenv?

对于Z-shell而言, ~/.zshenv 是另一个存储环境变量的好的地方. ~/.zshenv 总会被加载.

zsh的启动和关机文件

  • ~/.zprofile vs ~/.zlogin

两者做相同的事件, 即为登录式shell设置环境. 唯一的不同是加载的时间不同. 最佳实践是总是使用 ~/.zprofile

  • ~/.zshrc

.zshrc为交互式shell设置环境, 并且在 .zprofile 之后加载. .zshrc 将会覆盖在 .zprofile 中设置的任何东西. 这是个好地方, 可以用来定义登录式和交互式shell的别名和函数.

  • ~/.zshenv

不管shell是登录式, 交互式或者其它任何类型, ~/.zshenv最先被读取而且每次都会读取. 推荐在这里设置环境变量.

  • ~/.zlogout

~/.zlogout 会在登出会话的时候被读取. 在这里做清理工作很重要.

文件加载顺序

下面是这些 zsh 启动和关机文件的处理顺序.

.zshenv → .zprofile → .zshrc → .zlogin → .zlogout