Soru Bir Ruby komut dosyasından çıktıyı, kırık bir boru hatası almadan "kafa" ya nasıl yönlendirirsiniz?


Bu gibi görünen basit bir Ruby komut dosyası var

require 'csv'
while line = STDIN.gets
  array = CSV.parse_line(line)
  puts array[2]
end

Ama bu betiği böyle bir Unix boru hattında kullanmayı denediğimde, 10 satırlık çıktı alıp bir hatayla karşılaşıyorum:

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 komut dosyasını, kırık boru istisnasının kaldırılmasını engelleyecek şekilde yazmanın bir yolu var mı?


17
2018-05-16 21:14


Menşei




Cevaplar:


head ihtiyaç duyduğu tüm verileri okuduktan sonra standart çıktı akışını kapatıyor. İstisna ile baş etmeli ve standart çıktıya yazmayı bırakmalısınız. Standart çıkış kapatıldıktan sonra aşağıdaki kod döngüden çıkacaktır:

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

22
2018-05-16 21:26



Eğer kafa akışı kapatırsa neden o zaman $stdout.closed? yine de yanlış geri dönüyor ve hata neden hemen gerçekleşmiyor, ancak boşluğa birçok satır yazıldıktan sonra mı? Bence kafa aslında akışı açık tutuyor, fakat artık okumaz, bu da tamponun kırık noktaya neden olan bir noktada dolmasına neden olur. - sepp2k
@ sepp2k - Burada büyük olasılıkla bir kaç şey oluyor: 1, bir pipeline kullanırken stdout'un hat yönelimli blok yönelimli değişiklikler için varsayılan arabellek modu, bu nedenle her yazma arasında geçiş yapmanız gerekir. 2, head akışı kapatmak için koşma şansına ihtiyaç duyar, ancak daha fazla veri baytı çalışmaya başlama şansı olmadan yazılabilir. Ben bir betiğin varyantını yazdım. $stdout.flush ; sleep 0.1 her biri arasında writeve bu durumda $stdout.closed? Eserleri. - Aidan Cully
@AidanCully: Ah, çok ilginç. - sepp2k


Kullandığım numara değiştirmek head ile sed -n 1,10p.

Bu, boruyu açık tutar ruby (veya kırık boruları ve şikayetleri test eden herhangi bir başka program) kırık boruyu alamaz ve bu nedenle şikayet etmez. Satır sayısı için istediğiniz değeri seçin.

Açıkçası, bu Ruby komut dosyanızı değiştirmeye çalışmıyor. Ruby kodunda bunu yapmak kesinlikle bir yoldur. Bununla birlikte, 'baş yerine baştan çıkar' tekniği, mesajı oluşturan programı değiştirme seçeneğiniz olmadığı yerde bile çalışır.


10
2018-05-16 21:26