有关linux子shell变量的相关知识

发布时间:2019-09-20编辑:脚本学堂
linux的子shell到底是怎么定义的呢?子shell莫非就是shell打开一个新shell去执行程序,不过有时会让人很困苦的。

linux的子shell到底是怎么定义的呢?
子shell莫非就是shell打开一个新shell去执行程序,不过有时会让人很困苦的。
 

复制代码 代码如下:
[root@jbxue ~]# a=123
[root@jbxue ~]# (echo $a)
123
[root@jbxue ~]# echo "echo $a" > 1.sh
[root@jbxue ~]# cat 1.sh
echo $a
[root@jbxue ~]# bash 1.sh
[root@jbxue ~]#

man一下bash就可以查到,()中的命令会打开一个子shell去执行。在执行脚本的时候也会打开一个子shell去执行脚本程序,可是为什么结果不一样呢?
看下这个代码:

复制代码 代码如下:

 [root@jbxue ~]# echo $BASH_SUBSHELL
 0
 [root@jbxue ~]# (echo $BASH_SUBSHELL)
 1
  [root@jbxue ~]# echo $$
  4386
  [root@jbxue ~]# echo $BASHPID
  4386
  [root@jbxue ~]# (echo $$)
  4386
  [root@jbxue ~]# (echo $BASHPID)
  7206
  [root@jbxue ~]# (echo $BASHPID)
  7209
  [root@jbxue ~]# (echo $BASHPID)
  7210

BASH_SUBSHELL这个变量指的是当前shell的层数
BASHPID这个变量时bash 4.0后新添加的一个变量,指的是当前bash的PID。
$$  这个变量定义当前程序所在shell的PID

通过BASH_SUBSEHLL可以看出()这个操作确实在子shell中运行。
之所以在()中执行能看到变量$a的值,是因为:大家都知道,在linux中fork一个新的进程会赋值父进程的资源,()这种操作符打开的shell并没有重新初始化,而在一个脚本中执行就会重新初始化一个新shell。

还需要指出的就是:bash自带的shell变量,有些是自动变化的,有些是只读的,有些是不会自动变化只有重新初始化shell才会更新比如$$,$?等。
希望看了如下的例子,你便会明白了:
 

复制代码 代码如下:
[root@jbxue ~]# adsfasdf
bash: adsfasdf: command not found
[root@jbxue ~]# (echo $?)
127