有人可以解释以下行为吗?
$ 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 中的递减效果是一个错误;另一种可能性是可能会添加 SHLVL
和 ZSH_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/