我正在学习 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
答案2
在里面高级 Bash 脚本指南我找到了这个:
内部变量
$BASH_SUBSHELL
指示子 shell 的嵌套级别,而$SHLVL
变量没有变化在子 shell 内。
看起来是对的,它符合你的结果。另一方面Bash 参考手册说:
SHLVL
每次启动新的 Bash 实例时,该值都会增加一。这是为了计算 Bash shell 的嵌套深度。
我承认这可能具有误导性。我认为当您显式调用时“将启动 Bash 的新实例” bash
。根据这种解释,子 shell(…)
不算数;它们被视为原始 shell 的一部分。