2015-09-01 24 views
7

Ich habe eine Konsole Ruby-Skript erstellt, die ARGF verwendet, um Daten aus einer Datei oder Stdin zu laden, die dann Pry aufruft.Pry nicht zu stoppen, wenn von einem Ruby-Skript aus stdin aufgerufen

Das funktioniert großartig, wenn ich eine Datei übergebe (Pry pausiert) aber fehlschlägt (Pry stoppt nicht und beendet gerade Ruby), wenn ich meine Daten mit stdin übergebe.

Das ist seltsam, weiß jemand warum? Ich möchte Daten via Stdin weitergeben und Pry pausieren lassen.

Siehe, ein Beispielskript:

require 'rubygems' 
require 'pry' 


def pry_it(str) 
    binding.pry 
end 

pry_it(ARGF.read) 

Wenn ich diese App mit einer Datei in ARGV nenne ich meine richtige Antwort zu erhalten - hebel

% bundle exec ruby pry_test.rb file.txt 

From: /Users/wilcoxr/Development/json_pry/pry_test.rb @ line 8 Object#pry_it: 

    6: def pry_it(str) 
    7: 
=> 8: binding.pry 
    9: end 

[1] pry(main)> 

Große Pause! Ich kann ausführen Pry Befehle alles, was ich will

Wenn ich versuche, STDIN zu verwenden, um Daten in mein Werkzeug zu senden: eng

% cat file.txt | bundle exec ruby pry_test.rb 

From: /Users/wilcoxr/Development/json_pry/pry_test.rb @ line 8 Object#pry_it: 

    6: def pry_it(str) 
    7: 
=> 8: binding.pry 
    9: end 

[1] pry(main)> 
% 

Look: beachten Sie, ich bin wieder in meiner Shell-Prompt nicht in IRB hält inne. Seltsam! Ich verstehe nicht, warum ich dieses Verhalten bekomme ....

Antwort

4

Heh. Dieses Golfspiel dauerte zehn Minuten, um zu verstehen, was dieses Skript verrückt macht.

Versuchen ARGF mit einfach:

require 'rubygems' 
require 'pry' 
binding.pry 

Jetzt IO Operationen intern nicht abgedeckt durch ARGF.read und es wurde deutlich, was hier falsch ist. ARGF ist auf STDIN "geklebt", daher wird alles, was an STDIN übergeben wird direkt an pry 's Eingang.

Ich weiß nicht genau, welche Anweisung in Ihrem file.txt zwingt, aufzuhören, aber es gibt einen.


UPD Es sieht aus wie wenn Ruby-Skript etwas auf stdin (zB durch ein Rohr,) liefert sowohl $stdin und STDIN an diesem Rohr gesetzt, messing pry ‚s‚wo bin ich laufen aus‘ Erkennung auf.

kam ich mit dieser nicht-so-eleganten Lösung:

# read input from ARGF 
text = ARGF.read 

# prepare new stdin to satisfy pry 
pry_fd_stdin = IO.sysopen("/dev/tty") 
pry_stdin = IO.new(pry_fd_stdin, "r") 

# load pry and cheat it with our stdio 
require 'pry' 
Pry.config.input = pry_stdin 

binding.pry 

Diese Lösung einige Probleme hat (zum Beispiel hebel Prompt nur nach Eingabe angezeigt wird), aber die allgemeine Idee ist klar.

+0

Ich vermute, Sie sind auf etwas. Ich glaube nicht, dass der Inhalt meiner Eingabedatei dazu führt, dass Pry Dinge macht ... aber ich stimme dir zu, dass STDIN auf unterhaltsame Weise mit PRY interagiert Weil hier ein weiteres Beispiel dafür ist: echo Hallo "| Bündel exec ruby ​​pry_test.rb'. Dies gibt das gleiche Ergebnis wie oben: ein schneller Ausgang – RyanWilcox

+0

Versuchen Sie, den oben genannten Code mit 'ruby pry_test.rb mudasobwa

+0

Ok, ja ich stimme zu. Ich überprüfte auch den TTY-Status von stdin (mit 'puts IO.pipe.map (&: tty?)') Und gibt false zurück. Ich nehme an, dass Pry von STDIN liest, entweder indem er Befehle von stdin liest oder sieht, dass wir am Ende von STDIN sind - weil wir alles lesen, wie in meinem Beispiel - UND dass wir kein interaktives Terminal sind und beenden. Also ähm ... wie komm ich rum, dass ich mich wundere ... – RyanWilcox