免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3605 | 回复: 4
打印 上一主题 下一主题

[系统管理] 管道是一次性输出完后一次性被读取还是边写边读 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-06 09:33 |只看该作者 |倒序浏览
如下命令执行效果看起来是 “边写边读的”,就是for循环里echo一次,cat一次
  1. [root@localhost shdir]# for i in {0..5};do echo $i;sleep 0.2;done | cat
  2. 0
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
复制代码
但是如下的情况却不同,awk输出全部3行内容,才执行管道后的1.sh脚本
  1. [root@localhost shdir]# awk '{print $1;system("sleep 0.2")}' 1 | sh 1.sh
  2. start
  3. 1 2 3
  4. end
  5. [root@localhost shdir]# cat 1
  6. 1
  7. 2
  8. 3
  9. [root@localhost shdir]# cat 1.sh
  10. #!/bin/bash

  11. echo start
  12. filename=$(cat)
  13. echo $filename
  14. echo "end"
  15. [root@localhost shdir]# awk '{print $1;system("sleep 0.2")}' 1 | sh 1.sh
  16. start
  17. 1 2 3
  18. end
复制代码

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
2 [报告]
发表于 2014-09-06 09:57 |只看该作者
学生党:飘过~
对于awk output | shell input来说,shell接收awk的输出,并进行处理。需要注意的是,awk的output是先缓存在pipe中,等输出完毕后再调用shell命令 处理,shell命令只处理一次,而且处理的时机是“awk程序结束时,或者管道关闭时(需要显式的关闭管道)”

简单的说就是awk只允许开启一个管道,而且会把awk的输出先缓存到PIPE通道中然后一次性传递给脚本,脚本只用执行一次就可以了,awk中的管道和shell的管道要区分一下嗯

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
3 [报告]
发表于 2014-09-06 10:03 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2014-09-06 11:05 |只看该作者
本帖最后由 lwgarmstrong 于 2014-09-06 11:06 编辑

回复 2# 李满满


谢谢各位的解答

追问

如下命令,执行的效果也是每隔一秒输出一次结果,不是等awk执行完了,cat才开始全部一次性输出。

你说的pipe缓冲区是指awk自己内部的,还指这里命令显示指定的管道|。
  1. [root@localhost shdir]# cat 1
  2. 1
  3. 2
  4. 3
  5. [root@localhost shdir]# awk '{print $1;system("sleep 1")}' 1  | cat
  6. 1
  7. 2
  8. 3

复制代码

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
5 [报告]
发表于 2014-09-06 11:46 |只看该作者
你的cat是读取的是从缓存中一行一行读取的嗯回复 4# lwgarmstrong


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP