有人可以解释以下行为吗?
$ 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的误解是什么?
答案 0 :(得分:5)
在bash中,变量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
答案 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