关于$ SHLVL的Zsh怪异

时间:2014-11-01 12:35:02

标签: bash shell zsh

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

$ 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的误解是什么?

2 个答案:

答案 0 :(得分:5)

在bash中,变量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

答案 1 :(得分:0)

似乎是固定的。

我正在运行zsh 5.7.1

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