$SHLVL 没有增加(echo $SHLVL)

$SHLVL 没有增加(echo $SHLVL)

我正在学习 shell 脚本,并停留在这个小小的实验性 shell 脚本上:

1 #!/usr/bin/env bash
2 A=1
3 (A=2;echo "A is $A in $SHLVL")
4 echo "A is $A in $SHLVL"
5 exit 0

毫无疑问,第 3 行和第 4 行的 $A 是不同的,这可以解释为因为父进程无法读取子进程即子 shell 中创建的变量。但是第 3 行和第 4 行的 $SHLVL 是相同的,我以为第 3 行的 $A 应该比第 4 行的 $A 大 1。第 3 行的命令不是在子 shell 中执行的吗?我不知道我哪里理解错了。

感谢您的帮助。

答案1

您所编写的脚本中的 shell 级别没有改变。当您echo $SHLVL在终端中时,您将看到 shell 的当前运行级别。如果您在终端中使用该命令bash,您将创建一个子 shell 并增加 shell 级别,直到您退出该子 shell。您在脚本中创建的子 shell 是父级的子级,在父级的 shell 级别中运行。这就是为什么$SHLVL父进程和子进程相同。

在此处输入图片描述

答案2

在里面高级 Bash 脚本指南我找到了这个:

内部变量$BASH_SUBSHELL指示子 shell 的嵌套级别,而$SHLVL变量没有变化在子 shell 内。

看起来是对的,它符合你的结果。另一方面Bash 参考手册说:

SHLVL

每次启动新的 Bash 实例时,该值都会增加一。这是为了计算 Bash shell 的嵌套深度。

我承认这可能具有误导性。我认为当您显式调用时“将启动 Bash 的新实例” bash。根据这种解释,子 shell(…)不算数;它们被视为原始 shell 的一部分。

相关内容