我正在学习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中执行?我不知道我误解的地方。
答案 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
保持不变。
答案 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