在家目录下执行read x;cat $x
输入~/file 就会报错
而./file则没有问题 这是什么原因?
2.执行echo 'a b'|read x y;echo $x $y 反回值为空
而这样就没有问题echo 'a b'|while read x y;do echo $x $y;done
# 这个层次是相对的,不是绝对的,bash本身就不是绝对第一层,是以第一个启动的程序为相对第一层。nonigh 写了:明白了 管道符两边的命令都是在子进程中执行
但是echo $BASH_SUBSHELL|cat 得到0 好像左管道左边不是在子进程中执行的吧
另外我shell中执行:bash 这时的shell应该是子shell 但是echo $BASH_SUBSHELL还是得到0
我在脚本里写一行 echo $BASH_SUBSHELL sh执行这个脚本 也得到0
# 管道的左边不是子进程环境,比如:但是echo $BASH_SUBSHELL|cat 得到0 好像左管道左边不是在子进程中执行的吧
cat <<$BASH_SUBSHELL #我理解的是在当前shell下fork出一个子shell cat子shell中的$BASH_SUBSHELL cat是子进程 为什么执行环境不是子进程环境?#第一个管道的左边不是子进程环境,比如:
kose3@kose3-laptop:~$ cat <<<$BASH_SUBSHELL #不是子进程环境,但cat是子进程,因为不是内建命令。
0
kose3@kose3-laptop:~$ echo $BASH_SUBSHELL #没有子进程。
0
kose3@kose3-laptop:~$
不仇恨我就好...说点有用的行不 我头晕中cuihao 写了:严重仇恨LZ的头像。
#1输入 cat </dev/zerononigh 写了:cat <<$BASH_SUBSHELL #我理解的是在当前shell下fork出一个子shell cat子shell中的$BASH_SUBSHELL cat是子进程 为什么执行环境不是子进程环境?#第一个管道的左边不是子进程环境,比如:
kose3@kose3-laptop:~$ cat <<<$BASH_SUBSHELL #不是子进程环境,但cat是子进程,因为不是内建命令。
0
kose3@kose3-laptop:~$ echo $BASH_SUBSHELL #没有子进程。
0
kose3@kose3-laptop:~$
执行外部命令不需要子shell,外部命令本身就是子进程。关于进程环境 我好像是明白了 不知道是不是这样理解:
执行外部命令时有个fork-exec的步骤 经过exec函数处理后 代替了fork出的子shell 所以进程环境还是之前父shell的
应该没有触发exec,这时有两个进程环境,都是0,即是说互相独立的,就算确是父子进程关系:关于执行bash和sh运行脚本后 $BASH_SUBSHELL值仍然为0 我是按以下来理解的 不知道对不对:
fork出来的子shell $BASH_SUBSHELL的值会+1
执行bash后和用sh运行脚本时 fork出了子shell 这个子shell里的$BASH_SUBSHELL也会+1 但是随后会触发exec exec调用了bash代替了这个子shell
这个bash是初始的 所以$BASH_SUBSHELL的值又回到了默认的0
#不一定产生子shell,(cat </dev/zero) 就不会,因为没有环境操作有关的东西,cat本身是子进程,(cat <<<$BASH_SUBSHELL) 就不一样了,两个命令以上就会有子shell,为了确保命令操作是子进程吧,比如可能是内建命令。1.
前面您提到的例子:cat </dev/zero 创建了一个子进程 进程环境是父shell的
如果这样:(cat </dev/zero)呢?
我理解的是括号()fork了一个子shell 这个子shell中的cat是外部命令 所以应该再fork一个shell 称为孙shell吧 然后exec函数执行cat代替了这个孙shell
但是ps查看进程发现 cat这个进程的父shell还是最开始的运行(cat </dev/zero)的那个shell 它们之间没有子shell产生
再改一下:(cat </dev/zero;随便跟一个命令)
这样cat进程前就多了一个子shell 为什么?
外部命令会fork出子shell 这个说法是不是不够准确
当一个外部命令在子shell中 并且独占这个子shell时 不会再fork了 而是直接exec调用这个外部命令替换它所在的子shell?