$ SHLVL不会增加(echo $ SHLVL)

时间:2018-01-12 12:15:06

标签: linux bash shell

我正在学习shell脚本并坚持使用这个小实验性shell脚本:

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

毫无疑问,第3行和第4行中的$A彼此不同,这可以解释为是因为父进程无法读取子进程中创建的变量,即子shell。但是,第3行和第4行中的$SHLVL是相同的,我认为第3行中的$A应该比第4行中的$A大1。没有命令第3行在子shell中执行?我不知道我误解的地方。

2 个答案:

答案 0 :(得分:3)

您实际上需要在此使用$BASH_SUBSHELL代替$SHLVL

$BASH_SUBSHELL是一个内部变量,用于指示子shell的嵌套级别。

将您的脚本更改为:

#!/usr/bin/env bash

A=1
(A=2;echo "A is $A in $BASH_SUBSHELL:$SHLVL")
echo "A is $A in $BASH_SUBSHELL:$SHLVL"

现在它将输出:

A is 2 in 1:2
A is 1 in 0:2

您可以使用嵌套级别查看$BASH_SUBSHELL更改,但$SHLVL保持不变。

Check this helpful answer for more details

答案 1 :(得分:0)

当您在()中运行脚本的一部分时,您将生成子shell,代码将在其中执行。 但$SHLVL显示的不是您所期望的,$BASH_SUBSHELL确实如此。

$SHLVL表示用户深度有多少个shell。 当您刚刚通过服务器上的ssh登录时,通常是1。如果您运行shell脚本,它将变为2()会创建一个子shell,但$SHLVL不会影响子shell。

相反,$BASH_SUBSHELL将显示您需要 - 子shell级别。它将被更改,只需检查您的示例。

$ cat shlvl.sh 
#!/usr/bin/env bash
A=1
(A=2;echo "A is $A in $SHLVL" and  bash_subshell is $BASH_SUBSHELL)
echo "A is $A in $SHLVL ans bash_subshell is  $BASH_SUBSHELL"
exit 0
$ ./shlvl.sh 
A is 2 in 3 and bash_subshell is 1
A is 1 in 3 ans bash_subshell is  0