sh/bash/dash/ksh/zsh等Shell脚本
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#16
帖子
由 fnan » 2011-12-07 5:55
4.
管道和子shell
管道前后的命令是不是都会在子shell中运行? 还是只有管道后才在子shell中运行?
网上有很多文章说管道前后会并发两个子shell
我想不出合适的命令去验证 怎么写一个管道命令 管道前使用内建命令并使这个命令保持在进程中?
#可以三人成虎,不可能三人成真:
kose1-2@kose1-2-desktop:~$ echo 'echo level='$BASH_SUBSHELL >&0|cat <<<'cat level='$BASH_SUBSHELL
cat level=0
echo level=0
kose1-2@kose1-2-desktop:~$
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#17
帖子
由 fnan » 2011-12-07 20:57
.
当前目录下随便建立一文件temp
执行while true;do cat temp;done
cat是外部命令 而查看进程发现这个命令没有产生子进程 这是为什么?
#不是没有子进程,而是太快结束,检察不到。
1: kose3@kose3-laptop:~$ while true;do cat /proc/*;done
2: kose3@kose3-laptop:~$ ps -ef|grep -E '\bcat\b|\bbash\b'
kose3 1595 1593 0 07:49 pts/0 00:00:00 bash
kose3 1651 1593 0 07:52 pts/1 00:00:00 bash
kose3 1667 1595 4 07:52 pts/0 00:00:00 cat /proc/1 /proc/10 /proc/1029 /proc/1050 /proc/1072 /proc/1081 /proc/1082 /proc/1084 /proc/1085 /proc/1086 /proc/11 /proc/1101 /proc/1102 /proc/1104 /proc/1114 /proc/1157 /proc/12 /proc/1224。。。。。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
nonigh
- 帖子: 32
- 注册时间: 2010-04-21 10:28
#18
帖子
由 nonigh » 2011-12-08 21:36
谢谢fnan耐心解答 帮我解释了很多疑惑
虽然有些东西还是似懂非懂...

其实平时也很少会碰到这些细节的东西 有时候就喜欢钻牛角尖把自己绕进去...
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#19
帖子
由 fnan » 2011-12-09 22:22
# 还有个概念没讨论,程序:
kose3@kose3-laptop:~$ cat 1.sh
#!/bin/bash
echo '程序名:'$0' 进程号:'$$' 层次='$BASH_SUBSHELL
(echo -n '(小括号中)-程序名:'$0' 进程号:'$$' 层次='$BASH_SUBSHELL' 子bash进程:';pgrep bash -P $$)
echo '_________________________________________________________________________________________'
./2.sh
kose3@kose3-laptop:~$ cat 2.sh
#!/bin/bash
echo '程序名:'$0' 进程号:'$$' 层次='$BASH_SUBSHELL
ps -ef|grep -E '\bbash\b'
(echo '(小括号中)-程序名:'$0' 进程号:'$$' 层次='$BASH_SUBSHELL' 子bash进程:';pgrep bash -P $$)
kose3@kose3-laptop:~$ source 1.sh #用source是为了解除脚本限制!
程序名:bash 进程号:1532 层次=0
(小括号中)-程序名:bash 进程号:1532 层次=1 子bash进程:1658 #BASH_SUBSHELL+1 因为属于同一程序。
_________________________________________________________________________________________
程序名:./2.sh 进程号:1660 层次=0 #BASH_SUBSHELL=0 因为属于一新程序,虽然也是子bash进程!
kose3 1532 1530 0 09:03 pts/0 00:00:00 bash
kose3 1660 1532 0 09:12 pts/0 00:00:00 /bin/bash ./2.sh
(小括号中)-程序名:./2.sh 进程号:1660 层次=1 子bash进程: #这里脚本受限了,pgrep不执行!
kose3@kose3-laptop:~$
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
laofanorc
- 帖子: 9
- 注册时间: 2010-08-22 10:02
#20
帖子
由 laofanorc » 2011-12-11 17:02
shell中设计fork出子进程的目的是为了数据以及上下文(比如一些当前进程的环境变量,甚至一些全局变量)的安全而设计的。bash中像read这样的内建命令是bash特有的特权命令,既然是这样,那么在当前进程中使用内建命令时,这些内建命令共享一套上下文。这样,bash认为你所进行的一切外部命令都统一fork出一个子进程。所以管道命令只是传递参数,并不fork进程,具体是否该fork子进程则完全取决于你的命令。