Как получить статус выхода из 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}"