Linux系统下管道被接受方关闭的问题


 Linux shell中的管道|是非常方便的功能,可以将一个程序的输出作为另外一个程序的输入,这样我们可以将多个命令“拼”在一起,省去了临时文件的繁琐。windows中也有类似的用法,比如dir |more,学过dos命令的应该都知道吧。

    既然是管道,那么就有一个入口和一个出口,各自对应一个应用程序,正常的情况下,入口应用程序的输出应当被出口应用程序全部接受,但在一些特殊情况,出口应用程序会提前关闭管道,比如在查询svn的更新日志,只取前己行的时候:

    $ svn log |head

  ----------------

    r137 | Fwolf | 2007-05-28 13:38:47 +0800 (Mon, 28 May 2007) | 4 lines

    更新记录。

    svn: Write error: Broken pipe

    由于head只需要用到输入的前10行(默认行数,也可由用户指定),再接收剩下的输出也是多余,便提前关闭了管道,管道入口的应用程序svn发现之后,便报错退出了。在这个例子中,错误信息非常清楚,但不是所有应用程序都这样的,比如下面这个:

    $ find . -name "*rc" |xargs -i cat {}|head -1

    [Desktop]

    xargs: cat: terminated by signal 13

    错误信息似乎并不太好理解,实际上它的意思是:xargs发现它的子进程cat由于信号13被中止了。由于xargs本身属于循环操作,发现错误之后就停止了循环,这是其一;信号13是在cat试图向一个已关闭的pipe管道中写数据的时候,系统产生的,cat收到之后就停止了。类似于在cat输出的过程中,用户按下ctrl+c的效果。

    如何避免这种问题呢?很简单,管道后面使用不会提前关闭管道的程序即可,尤其是结合xargs使用的时候,它发现出错就不继续了。比如要用到head可以这样:

    $ cat file |head -1

    虽然cat仍然会被signal 13关闭,但bash是不会报错的,所以也只能针对一个文件进行操作,即使是使用了通配符也只能head到第一个文件。如果要加上对文件的遍历,可以用到for:

    $for file in .*rc;do cat $file |head -1;done

    cat依然会被关闭,但是for不会理会它,继续循环。head也可以直接指定文件名,这样我们就可以抛开cat了:

    $find . -name "*rc" |xargs -i head -n1 {}

    个人认为这是一种最完美的解决方式,即可以用到find强大的搜索指令,还不会涉及到管道的问题。不过如果文件名没有什么特殊要求,还有一种更简单的方式:

    $head -n1 .*rc

    在head的参数中直接用通配符指定文件

本文作者:



相关阅读:
推荐ASP超速入门视频教程
实现数据库事务的方法ExecuteSqlTran()
DISCUZ 论坛管理员密码忘记的解决方法
找到MySQL的优点
SQL 2005中的SSIS与Oracle数据库的迁移性能
Oracle清理和重建临时表空间
掌握盒模型轻松DIV CSS网页布局
IE中img多出5px的空白解决4种方法
php 上一篇,下一篇文章实现代码与原理说明
简单介绍Linux Ubuntu虚拟安装版本
oracle中自连接与case when,decode使用实例
系统死锁和资源管理器崩溃时设置XP自动重启
jquery1.4 教程三 新增方法教程
Transact-SQL 语言概述
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 科技有限公司2015年十一国庆放假通知 大班期中家长会发言稿 2010-2011学年小学新教师见习期培训工作计划 不愿意放弃,乜不愿意执着 2015初中军训心得体会 我的榜样【王刚发】 雨、作文400字 父母们,不要吝啬你们的爱 初中初一作文400字:幸福原来就在我们身边 月食没看到 天使的爱情作文350字 2009年国庆节60周年问候短信 不泯的梦想 大唐之镖行天下读后感800字 原谅不勇敢 妈妈无私的爱300字 小学五年级作文800字:记一个爱清洁讲卫生的人 青春励志电视剧:《乒乓》 财务总监工作职责以及年度述职报告 小学三年级作文650字:快乐秋游 兔子为什么会撞在树上 小学五年级作文500字:大象和山羊的故事(课堂写话) 洛迪,你真了不起作文500字 中考“百日动员大会”发言稿 烟草行业两个维护演讲稿—践行两个维护,奉献青春年华 苦了才懂得满足,痛了才了解生活,伤了才明白坚强, 诚实与信任作文550字 员工办公室请假条 律师事务所2016年度优秀员工获奖感言 国旗下讲话:春季开学典礼讲话 《自尊自爱自信自强》演讲稿 二瑞 奔向前方 税务局副科长竞聘上岗演讲稿 企鹅为啥不会飞 回乡过年 “我身边的社区”征文稿 小学五年级作文450字:小狗笨笨 魔尺作文300字 阳台上的有机菜园作文1100字 在乎,真好! 让我感动的一个人作文 小学六年级作文600字:捕鱼记 英文道歉信范文 《妈妈的背影》 在那短短的一瞬 岁月 回首 心灯是无形的智慧 社区党建工作2010年工作计划 中国历史名人排行榜网络搜集整理

Copyright © 2016 phpStudy |