- 论坛徽章:
- 0
|
没有你的环境,我猜下吧:
管道会产生sub shell,然后sub shell才去exec 具体的命令,可能搂主的 ps 命令正好钻到这个空子中去了,
我所说的空子就是 当前交互shell fork出好几个sub shell后, 还没开始exec具体的命令如 grep, awk,
此时 ps 执行了,所以ps看到的是bash, 倘若sub shell 在ps执行之前已经 exec 命令了,
ps 结果中看到的就是awk(看不到grep是因为被过滤了), 模拟下我的想法:
这个至少能看到2个bash,有一个一定可以看到的就是当前交互shell,
另一个能看到是因为ps执行的时候,第一个grep还没被执行,sub shell还在等sleep执行完,还没变身成grep呢:- ps -fe | (sleep 3;exec grep $$) | grep -v ps | grep -v grep | awk '{print $0}'
复制代码
这个只会看到1个bash,仅仅只有那个一定能看到的当前交互shell,
具体是因为 ps 一直迟迟得不到执行,等3秒后开始执行了,其他的sub shell都已经变身成功,不是bash了:- (sleep 3; exec ps -fe) | grep $$ | grep -v ps | grep -v grep | awk '{print $0}'
复制代码
所以楼主的情况是OS不同,甚至硬件不同,执行结果也是看到不一样,我用sleep,只是强制(理论上也不完全是强制,但做实验是可以的) 保证了 ps 的执行时机
BTW: 有个概念必须清楚,不然可能不容易看懂上面的,
管道看起来好像是顺序执行的,其实bash只管一个个统统fork出来,他们的执行顺序是随机的,只靠IO来同步的,
也就是说你一敲下回车,立刻会有好多sub shell 被 fork 出来,取决于你管道的数量
[ 本帖最后由 seeLnd 于 2009-1-16 19:14 编辑 ] |
|