2011-01-03 8 views
1

Ich habe dieses Skript, das den Benutzer in eine IRB-Sitzung ablegt, wenn ausgeführt.Benutzer auf IRB nach dem Lesen von Rohr fallen lassen

Alles gut, aber wenn ich * Nix-Pipes verwenden, um die Eingabe zu erhalten (z. B. mit cat), endet die IRB-Sitzung sofort.

Ich konnte das Skript reduzieren (nennen wir es myscript.rb) auf die folgenden:

 
require 'irb' 

if $stdin.stat.size > 0 
    @text = $stdin.read 
else 
    @text= "nothing" 
end 

ARGV.clear 
IRB.start 

Wenn er ausgeführt wird, wie: ruby myscript.rb, beende ich im IRB-Sitzung auf (wie erwartet).

aber (unter der Annahme foo.txt im cwd vorhanden): cat foo.txt | ruby myscript.rb wird nur die IRB Aufforderung drucken und dann die IRB-Sitzung geschlossen wird (ich bin auf $ bash fallen gelassen wird).

Alle bekannten Problemumgehungen oder Ideen?

BTW: es hat das gleiche Verhalten auf Ruby 1.8.7 sowie auf 1.9.2.

Antwort

2

Ich denke, Ihr Problem ist, dass wenn Sie zu Ihrem Skript STDIN wird der Stream aus Ihrer Datei, so wenn wenn Sie IRB starten wird es aus dem gleichen Stream lesen, aber beachten Sie, dass es an seinem Ende ist, und beenden, genau wie bei ctrl-D (ein manuelles Ende der Datei).

Sie können STDIN wieder öffnen aus dem tty (das heißt der Tastatur) wie folgt zu lesen:

STDIN.reopen(File.open('/dev/tty', 'r')) 

aber es sieht ein bisschen komisch für mich, ich habe nicht den richtigen IRB promt. IRB funktioniert jedoch.

+0

sieht aus wie dies das Problem ist, und $ stdin Wiedereröffnung wird eine Standard (I guess) IRB (keine Aufforderung, .irbrc nicht lesen und so weiter) erstellen. – aurelian

+0

auf der anderen Seite zurückspulen oder suchen (0) auf $ stdin wird nicht funktionieren (ist tty). – aurelian

+0

Was meinst du mit suchen (0) nicht funktioniert, warum würden Sie es brauchen? Wenn ich nicht klar war, meinte ich, dass du kurz vor IRB.start die stdin wieder öffnest. – Theo

0

$ stdin.read liest Ihre Eingabe, bevor IRB eine Chance hat, sie zu lesen (wenn Sie versuchen, IRB zu zwingen, Befehle von stdin auszuführen).

+0

foo.txt ist nur eine einfache Textdatei. – aurelian

2

@Theo identifiziert das Problem.

Wenn irb vor IRB.start erforderlich ist, werden auch die fehlenden IRB-Einstellungen korrigiert. Am Ende sieht der Code wie folgt aus:

 
if $stdin.stat.size > 0 
    @text = $stdin.read 
    $stdin.reopen(File.open("/dev/tty", "r")) 
else 
    @text= "nothing" 
end 

require 'irb' 
ARGV.clear 
IRB.start 
Verwandte Themen