Как получить статус выхода из ruby ​​Open3.popen3()?

Кажется, я застрял, пытаясь восстановить статус выхода команды оболочки, которая была запущена из ruby ​​Open3.popen3() - метода.

Здесь мой код:

require 'open3'
stdin, stdout, stderr = Open3.popen3('ls')

Когда я пытаюсь получить доступ к $?, он все равно nil

Можно ли все-таки получить статус выхода?

Примечания:
- ls - это не команда, которую я пытаюсь использовать в моем script. Я просто использовал это, чтобы привести пример. Мой script немного сложнее и содержит пользовательский ввод, поэтому мне нужна дезинфицирующая функциональность Open3.
- Я также попробовал вариант блока popen3, но с этим не получилось.

Ответы

Ответ 1

popen3 дает/возвращает четыре параметра, stdin, stdout, stderr и wait_thr. wait_thr содержит метод wait_thr.value, который возвращает статус выхода команды (фактически, это объект Process::Status в соответствии с документацией). Также посмотрите http://www.ruby-doc.org/stdlib-1.9.3/libdoc/open3/rdoc/Open3.html#method-c-popen3

Ответ 2

Краткий ответ заключается в использовании 4-го параметра open3: wait_thr

  • укажите, отображается ли какая-либо ошибка: wait_thr.value.success?
  • получить фактический уровень ошибки: wait_thr.value.exitstatus

Пример:

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?

Ответ 3

Все, что вам нужно (стандартный вывод, код ошибки и выхода) в трех строках:

require 'open3'
stdin, stdout, stderr, wait_thr = Open3.popen3("sleep 5; ls")
puts "#{stdout.read} #{stderr.read} #{wait_thr.value.exitstatus}"