nonigh 写了:明白了 管道符两边的命令都是在子进程中执行
但是echo $BASH_SUBSHELL|cat 得到0 好像左管道左边不是在子进程中执行的吧
另外我shell中执行:bash 这时的shell应该是子shell 但是echo $BASH_SUBSHELL还是得到0
我在脚本里写一行 echo $BASH_SUBSHELL sh执行这个脚本 也得到0
# 这个层次是相对的,不是绝对的,bash本身就不是绝对第一层,是以第一个启动的程序为相对第一层。
kose3@kose3-laptop:~$ ps -ef|grep bash
kose3 2206 2204 0 05:43 pts/0 00:00:00 bash #bash的父进程是2204.
kose3 2292 2206 0 05:54 pts/0 00:00:00 grep --color=auto bash
但是echo $BASH_SUBSHELL|cat 得到0 好像左管道左边不是在子进程中执行的吧
# 管道的左边不是子进程环境,比如:
kose3@kose3-laptop:~$ cat <<<$BASH_SUBSHELL #不是子进程环境,但cat是子进程,因为不是内建命令。
0
kose3@kose3-laptop:~$ echo $BASH_SUBSHELL #没有子进程。
0
kose3@kose3-laptop:~$
#单是这样好像还是不清楚:
kose3@kose3-laptop:~$ echo|cat <<<$BASH_SUBSHELL #管道右边也不是子进程环境。
0
#具体看看read的情况:
先打开两个终端: 1 2
1:
kose3@kose3-laptop:~$ echo $$
1743
2:
ose3@kose3-laptop:~$ ps -ef|grep bash
kose3 1743 1716 0 06:36 pts/1 00:00:00 bash #1是1743 父进程1716
kose3 1867 1716 0 07:03 pts/0 00:00:00 bash #2是1867 父进程1716
kose3 2135 1867 0 07:15 pts/0 00:00:00 grep --color=auto bash
kose3@kose3-laptop:~$
1输入命令:
kose3@kose3-laptop:~$ x=1;read x|echo 1-x=$x;echo 2-x=$x
1-x=1
(光标等待输入)
2输入命令:
kose3@kose3-laptop:~$ ps -ef|grep bash
kose3 1743 1716 0 06:36 pts/1 00:00:00 bash
kose3 1867 1716 0 07:03 pts/0 00:00:00 bash
kose3 2148 1743 0 07:19 pts/1 00:00:00 bash #read是内建命令,但在bash子进程2148执行,父进程是终端1 --1743。
kose3 2153 1867 0 07:20 pts/0 00:00:00 grep --color=auto bash
kose3@kose3-laptop:~$
1输入数字2:
kose3@kose3-laptop:~$ x=1;read x|echo 1-x=$x;echo 2-x=$x
1-x=1
2
2-x=1 #x还是=1
2输入命令:
kose3@kose3-laptop:~$ ps -ef|grep bash
kose3 1743 1716 0 06:36 pts/1 00:00:00 bash
kose3 1867 1716 0 07:03 pts/0 00:00:00 bash
kose3 2158 1867 0 07:24 pts/0 00:00:00 grep --color=auto bash #read打开的bash子进程结束了。
kose3@kose3-laptop:~$
1输入命令:
kose3@kose3-laptop:~$ x=1;read x;echo 1-x=$x;echo 2-x=$x
(光标等待输入)
2输入命令:
kose3@kose3-laptop:~$ ps -ef|grep bash
kose3 1743 1716 0 06:36 pts/1 00:00:00 bash
kose3 1867 1716 0 07:03 pts/0 00:00:00 bash
kose3 2162 1867 0 07:27 pts/0 00:00:00 grep --color=auto bash #这次read没有引起bash子进程。
kose3@kose3-laptop:~$
#后面的结果可以猜到了。
#分析一下可得出,当read和管道在一起,由于read不产生输出,shell就用子bash执行,为了马上执行后面的命令。