首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何通过管道将Ruby脚本的输出传递给'head‘,而不会出现管道断开错误

如何通过管道将Ruby脚本的输出传递给'head‘,而不会出现管道断开错误
EN

Stack Overflow用户
提问于 2010-05-17 05:14:46
回答 2查看 4.3K关注 0票数 17

我有一个简单的Ruby脚本,如下所示

代码语言:javascript
复制
require 'csv'
while line = STDIN.gets
  array = CSV.parse_line(line)
  puts array[2]
end

但是,当我尝试在Unix管道中使用这个脚本时,我得到了10行输出,后面跟着一个错误:

代码语言:javascript
复制
ruby lib/myscript.rb < data.csv  | head

12080450
12080451
12080517
12081046
12081048
12081050
12081051
12081052
12081054
lib/myscript.rb:4:in `write': Broken pipe - <STDOUT> (Errno::EPIPE)

有没有一种方法来编写Ruby脚本,以防止引发断开管道异常?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-17 05:26:58

在读取所需的所有数据后,head将关闭标准输出流。您应该处理异常,并停止写入标准输出。关闭标准输出后,以下代码将中止循环:

代码语言:javascript
复制
while line = STDIN.gets
  array = CSV.parse_line(line)
  begin
    puts array[2]
  rescue Errno::EPIPE
    break
  end
end
票数 22
EN

Stack Overflow用户

发布于 2010-05-17 05:26:01

我使用的诀窍是用sed -n 1,10p替换head

这将使管道保持打开状态,因此ruby (或任何其他测试管道是否损坏并发出警告的程序)不会得到损坏的管道,因此不会发出警告。为行数选择所需的值。

显然,这并不是要修改您的Ruby脚本。几乎可以肯定,在Ruby代码中有一种方法可以做到这一点。但是,即使您没有修改生成消息的程序的选项,“sed而不是head”技术仍然有效。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2845507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档