有关linux子shell变量的相关知识
linux的子shell到底是怎么定义的呢?
子shell莫非就是shell打开一个新shell去执行程序,不过有时会让人很困苦的。
[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才会更新比如$$,$?等。
希望看了如下的例子,你便会明白了:
bash: adsfasdf: command not found
[root@jbxue ~]# (echo $?)
127
您可能感兴趣的文章:
有关linux子shell变量的相关知识
linux shell自定义函数与变量作用域
shell脚本学习指南之shell变量
linux shell变量解析
linux怎么查看当前shell
shell编程基础之认识与学习BASH
深入学习linux shell数组
shell for循环与数组应用
inux shell初级入门教程
通过实例深入理解linux shell 数组