bash - 关于 $SHLVL 的 Zsh 怪异

标签 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 有什么误解?

最佳答案

在 bash 中,变量 SHLVL 不会为子 shell 递增,参见 abs guide .对于嵌套子 shell,请参阅 BASH_SUBSHELL

在 zsh 中,文档说 SHLVL 计算 shell 的数量,参见 here ,令人惊讶的是,ZSH_SUBSHELL 计算嵌套子 shell,请参阅 here .

对我来说,zsh 子 shell 中 SHLVL 的递减效果是一个错误;另一种可能性是可能会添加 SHLVLZSH_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/

相关文章:

macos - ln -s 和别名有什么区别?

shell - 如何从/etc/passwd中提取最大的UID值?

command-line - 在 zsh 中回显所有别名

cygwin zsh 首次启动 : command not found

bash - macOS Catalina 10.15(beta) - 为什么 ~/.bash_profile 不是由我的 shell 提供的?

bash - jq - 像数组一样遍历 bash 中的对象(aws 卷)

bash - 一旦目录中有 8 个文件,我试图删除目录中最旧的文件

bash - 出现错误: "ar: creating ../lib/libmgr.a"

eclipse - 在没有eclipse的情况下使用tomcat

android - 使用 run-as 在 ADB shell 中复制文件