据我了解,~/.zshenv
每次实例zsh
启动时都会获取该信息。
这意味着使用以下行将~/.zshenv
导致无限回归:
(echo "$$ $(date)" >> $HOME/.debug.zshenv)
...因为(...)
代表一个子shell,因此代表 的另一个来源~/.zshenv
,等等1
尽管如此,上面显示的行是无害的,AFAICT。特别是,$HOME/.debug.zshenv
在我使用以下命令启动新 shell 后仅显示一行
% zsh
显然,~/.zshenv
当评估上面的行时,不会重新获得来源。为什么不?
1就此而言,该表达式$(date)
还需要创建一个子 shell。
答案1
您误解了 subshell 的含义。子 shell 并不是一个全新的进程,而是现有进程的一个分支。
如果您zsh
明确调用例如
zsh -c 'echo "$$ $(date)" >> $HOME/.debug.zshenv'
然后 shell 分叉、调用execve()
,然后启动一个全新的 shell,再次进行初始化。