免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: cyaln
打印 上一主题 下一主题

bash的一点小疑惑 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-01-16 18:56 |只看该作者
没有你的环境,我猜下吧:

管道会产生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呢:
  1. ps -fe | (sleep 3;exec grep $$) | grep -v ps | grep -v grep | awk '{print $0}'
复制代码



这个只会看到1个bash,仅仅只有那个一定能看到的当前交互shell,
具体是因为 ps 一直迟迟得不到执行,等3秒后开始执行了,其他的sub shell都已经变身成功,不是bash了:
  1. (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 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP