linux的子shell到底是怎么定义的呢?
子shell莫非就是shell打开一个新shell去执行程序,不过有时会让人很困苦的。
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才会更新比如$$,$?等。
希望看了如下的例子,你便会明白了: