Configuración de entrada para llamadas al sistema () en ruby

Estoy tratando de descargar un archivo usando net / sftp y pasar su contenido como la entrada estándar para una aplicación de línea de comandos. Puedo hacerlo escribiendo primero el archivo en el disco, pero prefiero evitar ese paso.

¿Hay alguna forma de controlar la entrada a un progtwig invocado con system() en ruby?

No use el system en absoluto para este tipo de cosas, el system es el mejor para ejecutar un comando externo con el que no necesita hablar.

Use Open3.open3 o Open3.open2 para abrir algunas tuberías a su proceso externo, luego escriba en la tubería stdin como Open3.open3 Open3.open2 escribiendo en cualquier otro canal de IO; Si hay alguna salida con la que lidiar, entonces puede leerla directamente desde el canal de la salida estándar, como si fuera la lectura de cualquier otro canal de entrada IO.

Algo como esto tal vez (usando abrir como mu sugirió)?

 contents = "Hello, World!" open('|echo', 'w') { puts contents } 

Esto también se puede lograr con IO.expect

 require 'pty' require 'expect' str = "RUBY_VERSION" PTY.spawn("irb") do |reader, writer| reader.expect(/0> /) writer.puts(str) reader.expect(/=> /) answer = reader.gets puts "Ruby version from irb: #{answer}" end 

Esto espera a que el proceso generado muestre “0>” (el final de un indicador irb) y cuando ve que se imprime una cadena definida. Luego busca el irb que regresa al esperar que aparezca “=>” y toma los datos devueltos.