2010-09-15 7 views
1

J'ai un script que je veux exécuter avec open4.Problème avec l'utilisation de open4 dans Ruby

Voici le fichier:

scénario

#!/usr/bin/env ruby 
print "Enter your username: " 
username = gets 
puts "Here is your username: #{username}" 
print "Enter your password: " 
password = gets 
puts "Here is your password: #{password}" 

Alors je lance la CISR et le type:

ruby-1.9.2-p0 > pid, stdin, stdout, stderr = Open4::popen4("./script") 
=> [2649, #<IO:fd 9>, #<IO:fd 11>, #<IO:fd 13>] 

ruby-1.9.2-p0 > puts stdout.gets 

Dans la dernière ligne, je pensais qu'il devrait me donner « Entrez votre nom d'utilisateur : "mais ce n'est pas le cas. L'écran est vide, peu importe ce que je tape. Je peux seulement le terminer avec CTRL + C.

Alors je cours ...

ruby-1.9.2-p0 > puts stdout.gets 

... à nouveau, et cette fois il me donne "Entrez votre nom:".

Est-ce que quelqu'un sait pourquoi?

Répondre

0

C'est parce que stdout.gets veut lire une ligne entière incluant \n mais le script n'a pas encore imprimé de nouvelle ligne.

Donc, une chose que vous devez faire est de remplacer print par puts.

Une autre chose est que la sortie de l'enfant est tamponnée. Vous devez définir $stdout.sync = true à son démarrage ou appeler $stdout.flush après chaque puts.

Questions connexes