ruby - 如何将 Ruby 脚本的输出通过管道传输到 'head' 而不会出现管道损坏错误

标签 ruby unix pipe

我有一个简单的 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 脚本?

最佳答案

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

while line = STDIN.gets
  array = CSV.parse_line(line)
  begin
    puts array[2]
  rescue Errno::EPIPE
    break
  end
end

关于ruby - 如何将 Ruby 脚本的输出通过管道传输到 'head' 而不会出现管道损坏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845507/

相关文章:

regex - 如何使用sed将引号内的所有字母大写?

node.js - 管道未启动后nodejs流完成回调

php - 哪个 PHP 框架最接近于 ActiveRecord (RoR)

ruby-on-rails - 规范样式语法与 minitest in rails

linux - 哪个命令可以快速搜索一行中的连续模式

c - 我们是否需要显式关闭写端已经关闭的管道的读端?

html - 如何解决在 ionic 3 中实现搜索栏的管道时出现的错误(管道搜索无法找到或未找到)

Ruby 和 uniq 方法

ruby - 如何使用 UTF-8 编码的 HTTParty?

linux - 请帮忙为下面的场景编写unix脚本