2015-09-01 19 views
7

Ho creato uno script Ruby console che utilizza ARGF per caricare i dati da un file o stdin, che quindi chiama Pry.Fare leva non fermarsi quando viene chiamato da uno script Ruby che legge dallo stdin

Questo funziona perfettamente quando passo un file in (Pry pause) ma fallisce (Pry non si ferma ed esce da Ruby) quando passo i miei dati usando stdin.

Questo è strano, qualcuno sa perché? Vorrei passare i dati tramite stdin e fare in pausa Pry.

Ecco, uno script di esempio:

require 'rubygems' 
require 'pry' 


def pry_it(str) 
    binding.pry 
end 

pry_it(ARGF.read) 

Quando chiamo questa app con un file in ARGV ho la mia risposta adeguata - leva pausa

% 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)> 

Grande! Posso eseguire tutti i comandi leva voglio

Quando provo ad usare STDIN per inviare i dati in mio strumento:

% 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)> 
% 

sguardo da vicino: NOTA Sono tornato al mio prompt della shell, non pause nella IRB. Strano! Non capisco perché sto prendendo questo comportamento ....

risposta

4

Heh. Questo golf mi ha richiesto dieci minuti per capire cosa spinge questi script.

Prova ARGF con semplice:

require 'rubygems' 
require 'pry' 
binding.pry 

Ora IO operazioni non sono coperti internamente da ARGF.read ed è diventato evidente che cosa c'è che non va qui. ARGF è "incollato" a STDIN, quindi tutto ciò che viene passato a STDIN passa direttamente all'ingresso di pry.

Non so esattamente quali istruzioni nel tuo file.txt forzano a uscire, ma ce n'è uno.


UPD Sembra se script Ruby cede nulla sul stdin (ad esempio attraverso un tubo,) sia $stdin e STDIN sono impostati per questo tubo, pasticciano pry s' ‘in cui sono corro da’ rilevamento.

sono arrivato fino a questo non-così-soluzione elegante:

# 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 

Questa soluzione ha alcuni difetti (per esempio prompt di leva viene visualizzata solo dopo ingresso,), ma l'idea generale è chiaro.

+0

Sospetto che tu stia partecipando a qualcosa. Non penso che sia il contenuto del mio file di input che induce Pry a fare cose ... ma sono d'accordo con te sul fatto che STDIN potrebbe interagire con PRY in modi divertenti Perché ecco un altro esempio di cosa succede: 'echo" ciao "| pacchetto exec ruby ​​pry_test.rb'. Questo dà lo stesso risultato di cui sopra: una rapida uscita – RyanWilcox

+0

Prova ad eseguire il codice sopra con 'ruby pry_test.rb mudasobwa

+0

Ok, sì sono d'accordo. Ho anche controllato lo stato TTY di stdin (con 'puts IO.pipe.map (&: tty?)'), E restituisce false. Quindi immagino che Pry legga da STDIN, o leggendo i comandi da stdin O vedendo che siamo alla fine di STDIN - perché lo leggiamo tutti, come il mio esempio - E che non siamo un terminale interattivo, ed esce. Quindi ummm ... come faccio a girarmi che mi chiedo ... – RyanWilcox

Problemi correlati