SHLVL和BASH_SUBSHELL 变量

第一次看到 SHLVL 这个变量是在~/.bash_logout文件中,贴出文件代码,因为这个是退出shell时执行的脚本,所以猜测这个变量是记录打开了几个bash的。

if [ "$SHLVL" = 1 ]; then
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

经过百度,发现SHLVL这个变量确实是用来记录这个的,同时还发现有个跟它类似的变量BASH_SUBSHELL ,两个变量的概念有点相同,先放出我看到的两个变量的描述:

SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器,而 BASH_SUBSHELL 是记录一个 Bash 进程实例中多个子 Shell(subshell)嵌套深度的累加器。

是不是感觉都是一个意思,那接着往下看

从图中可以看出,在Bash中打开另一个Bash,重新打开的那个Bash并不属于子Shell,它只是因为执行了外部命令而运行了一个新的Bash,这个Bash也有自己的运行环境,但一个真正的子Shell是不需要重新用外部命令启动的,并且子Shell可以访问父Shell中定义的变量。

子Shell允许在不影响当前Shell的环境下去执行操作,可以通过括号实现创建一个子Shell

从图中可以得到下面结论:

1.子Shell允许在不影响当前Shell的环境下去执行操作

2.括号中打印出来BASH_SUBSHELL 变量的值为1,证明这个过程真的创建了一个子Shell

3.子Shell可以使用父Shell创建的变量

 

下面用Bash命令新建一个Shell来跟上面做个对比,

可以得出:

1.在父Shell中定义的变量在子Shell中用不了

2.BASH_SUBSHELL这个值也没有发生变化,说明没有创建子Shell

3.用pwd命令得到的结果同创建子Shell类似

 

但是两种情况下使用pwd命令的含义不一样

在真正进入子Shell那里是为了验证:子Shell允许在不影响当前Shell的环境下去执行操作

在打开另一个Shell那里是为了验证:两个Shell间没有必然联系

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值