关于$ SHLVL的Zsh怪异

elm*_*art 3 bash shell zsh

请问有人解释以下行为吗?

$ echo $SHLVL
1
$ zsh -c 'echo $SHLVL'
2
$ zsh -c '(echo $SHLVL)'
1
Run Code Online (Sandbox Code Playgroud)

我不明白最后的结果.zsh是否为()子shell重置$ SHLVL?Bash结果不同:

$ echo $SHLVL
1
$ bash -c 'echo $SHLVL'
2
$ bash -c '(echo $SHLVL)'
2
Run Code Online (Sandbox Code Playgroud)

至少,这似乎更符合逻辑.在一个案例中,当我测试这个时,我期待最后一个结果为3.为什么没有shell给出结果呢?我对$ SHLVL的误解是什么?

Edo*_*iel 6

在bash中,变量SHLVL不会为子壳增加,请参阅abs guide.对于嵌套的子壳,请参阅BASH_SUBSHELL.

在zsh中,doc说明了SHLVL计算shell的数量,请参见此处,而且,令人惊讶的是,ZSH_SUBSHELL计算嵌套的子shell,请参见此处.

对我来说,SHLVLzsh子shell中的递减效果是一个bug; 另一种可能性可能是SHLVL并且ZSH_SUBSHELL可能会被添加(未记录的功能?).

$ zsh -c 'print $SHLVL $ZSH_SUBSHELL ; (print $SHLVL $ZSH_SUBSHELL)'
2 0
1 1
Run Code Online (Sandbox Code Playgroud)