¿Cómo probar scripts de Ruby similares a filtros con Pry?

Tengo un script simple que procesa las líneas que vienen de STDIN. A veces surge una excepción, algún error de conversión de UTF-8, y me gustaría examinar las variables, lo que causa el error. Utilizo la siguiente syntax en mi archivo (llamemos filter.rb), pero nunca obtengo un indicador de palanca:

#!/usr/bin/ruby require "pry" n=0 while line=STDIN.gets do begin n=n+1 raise "an exception" if n==2 rescue => e binding.pry end end 

Cuando emito:

 cat data.txt|ruby filter.rb 

Veo en la pantalla:

  5: while line= STDIN.gets do 6: begin 7: n=n+1 8: raise "an exception" if n==2 9: rescue => e => 10: binding.pry 11: end 12: end 

Pero, de hecho, todo lo que obtengo es un indicador de bash, no un indicador de comando de Pry.

El problema es que Pry usa Readline , que a su vez lee desde stdin. Si usas ruby ​​como filtro, stdin ya no es un terminal (isatty será false). Así que Readline no podrá usar stdin y marchas silenciosas en (o da un error de syntax y marchas en, si tienes suerte).

Puedes darle a Readline un tty funcional añadiendo

 require "readline" Readline.input = IO.new(IO.sysopen("/dev/tty", "r+")) 

a su codigo

La documentación de Pry sugiere esta solución, pero no sé si Pry lo autoriza, o si podría causar interacciones extrañas con otras partes de Pry, Ruby y cualquier otra parte móvil que pueda tener en su aplicación … YMMV.

Creo que la respuesta de BertD funcionará bien.

Lo más fácil es leer el archivo normalmente, (aproximadamente) por ejemplo,

 File.new("data.txt").each_line do |line| begin n += 1 raise "an exception" if n == 2 rescue => e binding.pry end end 

También recomendaría encapsular el procesamiento en una clase / método, de modo que la forma en que los datos lleguen a la entrada sea un tema aparte de lo que sucede con los datos. También hace mucho más fácil la depuración de cosas en aislamiento.