本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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