有人可以解释以下行为吗?

$ echo $SHLVL
1
$ zsh -c 'echo $SHLVL'
2
$ zsh -c '(echo $SHLVL)'
1

我不明白最后的结果。 zsh 是否为 () 子 shell 重置 $SHLVL?
Bash 结果不同:
$ echo $SHLVL
1
$ bash -c 'echo $SHLVL'
2
$ bash -c '(echo $SHLVL)'
2

至少,这似乎更合乎逻辑。
在某种情况下,当我测试这个时,我期望最后一个结果是 3。为什么没有shell给出这个结果?我对 $SHLVL 有什么误解?

最佳答案

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

在 zsh 中,文档说 SHLVL 计算 shell 的数量,请参阅 here ,令人惊讶的是, ZSH_SUBSHELL 计算嵌套的子 shell ,请参阅 here

对我来说,SHLVL 在 zsh 子shell 中的递减效果是一个错误;另一种可能性是可能会添加 SHLVLZSH_SUBSHELL(未记录的功能?)。

$ zsh -c 'print $SHLVL $ZSH_SUBSHELL ; (print $SHLVL $ZSH_SUBSHELL)'
2 0
1 1

关于bash - Zsh 关于 $SHLVL 的怪异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26689364/

10-14 16:29
查看更多