Linux中国  设为主页
 收藏本站
 
当前位置: > 首页 ->Linux技术 ->网络应用 ->解决Linux系统下管道被接受方关闭的问题
  相关分类: 
入门与提高
系统管理
网络应用
嵌入式系统
内核研究
服务器相关
发行版专区
Linux程序设计
Linux安全
BSD相关
桌面应用
  站内搜索: 
热门文章排行
热门文章排行 使用Linux L2TP/IPsec VPN 服务器 (04-22)
让你的Linux用起来跟Windows无异(图(08-15)
Linux代理服务器和防火墙配置详细解(05-28)
高手进阶 学会做嵌入式Linux操作系统(06-03)
如何在Linux下查看已经安装了哪些软(04-25)
精采文章排行
精采文章排行 解决Linux系统下管道被接受方关闭的(04-24)
Linux操作系统下三种配置环境变量的(04-24)
Ubuntu新版Linux免费下载与Novell竞(04-24)
Linux操作系统下图形界面模式更改IP(04-24)
把IE收藏夹导出到Ubuntu系统下的Fire(04-24)
  ·Linux操作系统下三种配置环境变量的方法·Ubuntu新版Linux免费下载与Novell竞争激·Linux操作系统下图形界面模式更改IP地址·把IE收藏夹导出到Ubuntu系统下的Firefox·Ubuntu Linux系统使用Vim进行Rails编码·在Linux Debian操作系统下成功安装E17桌·第二届年度红帽创新奖颁予创新科技成就·分析称Linux可在2013年占有20%移动市场·KDE和GNOME两大阵营将携手共创Linux桌面

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

作者:Webmaster   来源:   点击:   日期:2008-04-24 [收藏] [投稿]

  IE是否经常中毒?推荐您

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的参数中直接用通配符指定文件。

(责任编辑:云子)



 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:Linux操作系统下三种配置环境变量的方法   下一篇:没有了
文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论

   相关文章:
·解决Linux系统下管道被接受方关闭的问题

   文章评论:(1条)
  
 请留名: 匿名评论   点击查看所有评论 论坛讨论
 

 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。