ZSH 启动配置文件

文章摘取、翻译自 A User’s Guide to the Z-Shell - Chapter 2: What to put in your startup files

Shell 的种类

首次,我们认识下什么是 interactive 和 login shell。

Interactive/Non-Interactive shells

shell 只是获取一些命令然后执行他们,并不关心是从一个文件输入的命令,还是从命令行上手打的。
在提示框中输入并等待每个命令执行的 shell 是 interactive 的;从文件中读取的命令的 shell 是 non-Interactive 的。

Login/Non-login shells

当你登录一台电脑,运行的 shell 是交互式的,也是登录的。如果你输入 zsh ,则会启动另外一个 non-login shell。
如果想尝试启动一个 login shell,可输入 zsh -l 试试 。

login shell 主要区别是在执行启动文件过程中,下面会有描述。
另一个区别在你退出的时候。在login shell中,你可以输入 logout 退出;而 non-login shell 则需要输入 exit
然而 exit 在其他类型(interactive、non-interactive、login……)的 shell 上是通用的。

PSbye 等同于 exit

PS2:验证是否登录:

if [[ -o login ]]; then
    print yes
else
    print no
fi

# one-liner
if [[ -o login ]]; then; print yes; else; print no; fi

所有启动配置(startup)文件

/etc/zshenv
    对于每个 zsh 总是执行。
~/.zshenv
    对于每个 zsh,通常都会执行。(下面「NO_RCS」会影响)
/etc/zprofile
    在 login shells 执行。
~/.zprofile
    在 login shells 执行。
/etc/zshrc
    在 interactive shells 执行。
~/.zshrc
    在 interactive shells 执行。
/etc/zlogin
    在 login shells 执行。
~/.zlogin
    在 login shells 执行。

文件位置

输入 print $ZDOTDIR 确定启动文件位置。如果不是空的或者报错,启动文件位于 「$ZDOTDIR」;否则在 「~」。

/.zprofile」和「/.zlogin」的区别在相对于「~/.zshrc」的执行时机:一个在前,一个在后。

如果设置了 「NO_RCS」选项 或者 zsh -f,则跳过其他文件,只会执行 「/etc/zshenv」。
因为「/etc/zshenv」总会执行,「the First Law of Zsh Administration」告诉我们:

put as little as possible in the file /etc/zshenv, as every single zsh which starts up has to read it.

总之,尽量保持 「/etc/zshenv」简洁,通常会用以下代码包裹选项设置。

if [[ ! -o norcs ]]; then
    ... <commands to run if NO_RCS is not set,
    such as setting options> ...
fi

Logout

「~/.zlogout」和「/etc/zlogout」在最后按照顺序执行。
正如他们名字那样,他们是 zlogin 文件的反面,他们也只会在 login shells 中执行。

如果你任何类型的 shell 执行最后对运行一个文件,可以这样:

 TRAPEXIT() {
    # commands to run here, e.g. if you
    # always want to run .zlogout:
    if [[ ! -o login ]]; then
      # don't do this in a login shell
      # because it happens anyway
       . ~/.zlogout
    fi
 }

如果在 「.zshrc」中放入以上代码,所有 interactive shells 都会在最后强制执行「.zlogout」。