为什么 ~/.zshenv 中的子 shell 表达式不会导致无限回归?

为什么 ~/.zshenv 中的子 shell 表达式不会导致无限回归?

据我了解,~/.zshenv每次实例zsh启动时都会获取该信息。

这意味着使用以下行将~/.zshenv导致无限回归:

(echo "$$ $(date)" >> $HOME/.debug.zshenv)

...因为(...)代表一个子shell,因此代表 的另一个来源~/.zshenv,等等1

尽管如此,上面显示的行是无害的,AFAICT。特别是,$HOME/.debug.zshenv在我使用以下命令启动新 shell 后仅显示一行

% zsh

显然,~/.zshenv当评估上面的行时,不会重新获得来源。为什么不?


1就此而言,该表达式$(date)还需要创建一个子 shell。

答案1

您误解了 subshel​​l 的含义。子 shell 并不是一个全新的进程,而是现有进程的一个分支。

如果您zsh明确调用例如

zsh -c 'echo "$$ $(date)" >> $HOME/.debug.zshenv'

然后 shell 分叉、调用execve(),然后启动一个全新的 shell,再次进行初始化。

相关内容