¿Cómo recuperar el estado de salida de ruby Open3.popen3()?
(3)
La respuesta concisa es usar el 4to parámetro de open3: wait_thr
- obtener si se indica algún error:
wait_thr.value.success?
- obtener el nivel de error real:
wait_thr.value.exitstatus
Muestra:
Open3.popen3(command) do |stdin, stdout, stderr, wait_thr|
return_value = wait_thr.value
end
puts "Error level was: #{return_value.exitstatus}" unless return_value.success?
Parece que estoy atascado tratando de recuperar el estado de salida de un comando de shell que se inició desde el método Open3.popen3 () de ruby.
Aquí está mi código:
require ''open3''
stdin, stdout, stderr = Open3.popen3(''ls'')
¿Cuando ahora intento acceder a $?
todavía es nil
¿Es posible recuperar el estado de salida después de todo?
Notas:
- ls
no es el comando que estoy tratando de usar en mi script. Acabo de usar esto para dar un ejemplo. Mi script es un poco más complejo y contiene información del usuario, por lo que necesito la funcionalidad de limpieza de Open3.
- También probé la variante de bloque de popen3, pero tampoco tuve éxito con eso.
Todo lo que necesita (salida estándar, error y código de salida) en tres líneas:
require ''open3''
stdin, stdout, stderr, wait_thr = Open3.popen3("sleep 5; ls")
puts "#{stdout.read} #{stderr.read} #{wait_thr.value.exitstatus}"
popen3
produce / devuelve cuatro parámetros, stdin
, stdout
, stderr
y wait_thr
. wait_thr
contiene un método wait_thr.value
que devuelve el estado de salida del comando (de hecho, es un objeto Process::Status
según la documentación). También eche un vistazo a http://www.ruby-doc.org/stdlib-1.9.3/libdoc/open3/rdoc/Open3.html#method-c-popen3