请问有人解释以下行为吗?
$ echo $SHLVL
1
$ zsh -c 'echo $SHLVL'
2
$ zsh -c '(echo $SHLVL)'
1
Run Code Online (Sandbox Code Playgroud)
我不明白最后的结果.zsh是否为()子shell重置$ SHLVL?Bash结果不同:
$ echo $SHLVL
1
$ bash -c 'echo $SHLVL'
2
$ bash -c '(echo $SHLVL)'
2
Run Code Online (Sandbox Code Playgroud)
至少,这似乎更符合逻辑.在一个案例中,当我测试这个时,我期待最后一个结果为3.为什么没有shell给出结果呢?我对$ SHLVL的误解是什么?
在bash中,变量SHLVL
不会为子壳增加,请参阅abs guide.对于嵌套的子壳,请参阅BASH_SUBSHELL
.
在zsh中,doc说明了SHLVL
计算shell的数量,请参见此处,而且,令人惊讶的是,ZSH_SUBSHELL
计算嵌套的子shell,请参见此处.
对我来说,SHLVL
zsh子shell中的递减效果是一个bug; 另一种可能性可能是SHLVL
并且ZSH_SUBSHELL
可能会被添加(未记录的功能?).
$ zsh -c 'print $SHLVL $ZSH_SUBSHELL ; (print $SHLVL $ZSH_SUBSHELL)'
2 0
1 1
Run Code Online (Sandbox Code Playgroud)