我有一个简单的Ruby脚本,看起来像这样
require 'csv'
while line = STDIN.gets
array = CSV.parse_line(line)
puts array[2]
end
但是当我尝试在这样的Unix管道中使用这个脚本时,我得到10行输出,然后是错误:
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脚本?
答案 0 :(得分:22)
head
在读取所需的所有数据后关闭标准输出流。您应该处理异常并停止写入标准输出。一旦标准输出关闭,以下代码将中止循环:
while line = STDIN.gets
array = CSV.parse_line(line)
begin
puts array[2]
rescue Errno::EPIPE
break
end
end
答案 1 :(得分:10)
我使用的技巧是将head
替换为sed -n 1,10p
。
这使管道保持打开状态,因此ruby
(或任何其他测试管道损坏和抱怨的程序)不会破坏管道,因此不会抱怨。选择所需的行数。
显然,这并不是在尝试修改您的Ruby脚本。几乎可以肯定有一种方法可以在Ruby代码中实现。但是,即使您没有修改生成消息的程序,也可以使用'sed而不是head'技术。