有人可以解释以下行为吗?
$ 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 中,变量 SHLVL
不会为子 shell 递增,参见 abs guide .对于嵌套子 shell,请参阅 BASH_SUBSHELL
。
在 zsh 中,文档说 SHLVL
计算 shell 的数量,参见 here ,令人惊讶的是,ZSH_SUBSHELL
计算嵌套子 shell,请参阅 here .
对我来说,zsh 子 shell 中 SHLVL
的递减效果是一个错误;另一种可能性是可能会添加 SHLVL
和 ZSH_SUBSHELL
(未记录的功能?)。
$ zsh -c 'print $SHLVL $ZSH_SUBSHELL ; (print $SHLVL $ZSH_SUBSHELL)'
2 0
1 1
关于bash - 关于 $SHLVL 的 Zsh 怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26689364/